C# 动态加载资源并读取CurrentUICulture的正确值

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

我正在创建一个将枚举转换为友好字符串的方法。友好名称存储在资源文件中,并受全球化影响。因此,我创建了两个资源文件:Enums.resx和Enums.pt-BR.resx,它们的键是enum的名称,后跟它的值(即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();
      }

}
公共静态字符串枚举字符串(对象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
我希望这有助于任何人在未来尝试类似的东西