C# 动态加载资源并读取CurrentUICulture的正确值
我正在创建一个将枚举转换为友好字符串的方法。友好名称存储在资源文件中,并受全球化影响。因此,我创建了两个资源文件:Enums.resx和Enums.pt-BR.resx,它们的键是enum的名称,后跟它的值(即DeliveryStatus_WaitingForPayment) 这是我用来加载资源并获取枚举对应的友好名称的代码:C# 动态加载资源并读取CurrentUICulture的正确值,c#,resources,globalization,resx,resourcemanager,C#,Resources,Globalization,Resx,Resourcemanager,我正在创建一个将枚举转换为友好字符串的方法。友好名称存储在资源文件中,并受全球化影响。因此,我创建了两个资源文件:Enums.resx和Enums.pt-BR.resx,它们的键是enum的名称,后跟它的值(即DeliveryStatus_WaitingForPayment) 这是我用来加载资源并获取枚举对应的友好名称的代码: public static string EnumToString<T>(object obj) { string key = String.Em
public static string EnumToString<T>(object obj)
{
string key = String.Empty;
Type type = typeof(T);
key += type.Name + "_" + obj.ToString();
Assembly assembly = Assembly.Load("EnumResources");
string[] resourceNames = assembly.GetManifestResourceNames();
ResourceManager = null;
for(int i = 0; i < resourceNames.Length; i++)
{
if(resourceNames[i].Contains("Enums.resources"))
{
rm = new ResourceManager(resourceNames[i], Assembly.GetExecutingAssembly());
Stream resStream = assembly.GetManifestResourceStream(resourceNames[i]);
ResourceReader reader = new ResourceReader(resStream);
IDictionaryEnumerator dict = reader.GetEnumerator();
while (dict.MoveNext())
{
string keyToCompare = dict.Key.ToString();
if (keyToCompare == key)
return dict.Value.ToString();
}
}
return obj.ToString();
}
}
公共静态字符串枚举字符串(对象obj)
{
string key=string.Empty;
类型=类型(T);
key+=type.Name+“”+obj.ToString();
Assembly=Assembly.Load(“枚举资源”);
字符串[]resourceNames=assembly.GetManifestResourceNames();
ResourceManager=null;
for(int i=0;i
此方法工作得几乎完美,只是它忽略了CurrentUICulture并始终从默认资源返回值,也就是说,即使将pt BR用作我的CurrentUICulture,它也将从Enum.resx而不是Enum.pt-BR.resx加载值
我做错了什么?事实证明,我读取资源文件的方法是错误的。我不仅不需要在流中工作,而且还阻止了我获得基于当前UICulture的结果 解决方案比我第一次尝试时简单得多:
public static string EnumToString<T>(object obj)
{
string key = String.Empty;
Type type = typeof(T);
key += type.Name + "_" + obj.ToString();
Assembly assembly = Assembly.Load("EnumResources");
string[] resourceNames = assembly.GetManifestResourceNames();
ResourceManager = null;
for(int i = 0; i < resourceNames.Length; i++)
{
if(resourceNames[i].Contains("Enums.resources"))
{
//The substring is necessary cause the ResourceManager is already expecting the '.resurces'
rm = new ResourceManager(resourceNames[i].Substring(0, resourceNames[i].Length - 10), assembly);
return rm.GetString(key);
}
return obj.ToString();
}
}
公共静态字符串枚举字符串(对象obj)
{
string key=string.Empty;
类型=类型(T);
key+=type.Name+“”+obj.ToString();
Assembly=Assembly.Load(“枚举资源”);
字符串[]resourceNames=assembly.GetManifestResourceNames();
ResourceManager=null;
for(int i=0;i
我希望这有助于任何人在未来尝试类似的东西 事实证明,我读取资源文件的方法是错误的。我不仅不需要在流中工作,而且还阻止了我获得基于当前UICulture的结果 解决方案比我第一次尝试时简单得多:
public static string EnumToString<T>(object obj)
{
string key = String.Empty;
Type type = typeof(T);
key += type.Name + "_" + obj.ToString();
Assembly assembly = Assembly.Load("EnumResources");
string[] resourceNames = assembly.GetManifestResourceNames();
ResourceManager = null;
for(int i = 0; i < resourceNames.Length; i++)
{
if(resourceNames[i].Contains("Enums.resources"))
{
//The substring is necessary cause the ResourceManager is already expecting the '.resurces'
rm = new ResourceManager(resourceNames[i].Substring(0, resourceNames[i].Length - 10), assembly);
return rm.GetString(key);
}
return obj.ToString();
}
}
公共静态字符串枚举字符串(对象obj)
{
string key=string.Empty;
类型=类型(T);
key+=type.Name+“”+obj.ToString();
Assembly=Assembly.Load(“枚举资源”);
字符串[]resourceNames=assembly.GetManifestResourceNames();
ResourceManager=null;
for(int i=0;i
我希望这有助于任何人在未来尝试类似的东西