动态加载资源并读取当前文化的正确值
-
30-09-2019 - |
题
我正在创建一种将枚举转换为友好字符串的方法。友好名称存储在资源文件中,并受到全球化的影响。因此,我创建了两个资源文件:enums.resx and Enums.pt-br.resx,其键是枚举的名称,其价值后面是其值(IE DeliveryStatus_WaitingForpayment)。
这是我用来加载资源并获取枚举的相应友好名称的代码:
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();
}
}
此方法几乎可以完美地工作,除了它忽略了当前的文化并始终从默认资源返回值,也就是说,即使我使用pt-br作为我的当前栽培,它也会从enum.resx加载值。 -br.resx。
我究竟做错了什么?
解决方案
事实证明,我采用错误的方法来读取资源文件。不仅我不需要通过流努力,还阻止了我基于当前培养的结果。
解决方案比我的第一次尝试要容易得多:
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();
}
}
我希望这可以帮助任何人在将来尝试类似的事情!
不隶属于 StackOverflow