动态加载资源和读取正确的值了的CurrentUICulture(Dynamically loadin

2019-10-23 15:51发布

我创建一个方法来枚举转换为字符串友好。 友好的名称都存储在一个资源文件,并受到全球化。 所以,我创建了两个资源文件:Enums.resx和Enums.pt-BR.resx的键是枚举,然后它的名称是值(即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();
      }

}

此方法效果几乎是完美的,除了它忽略了的CurrentUICulture并始终从默认的资源返回的值,也就是说,即使当我使用PT-BR作为我的CurrentUICulture它将加载从Enum.resx而不是Enum.pt值-BR.resx。

我究竟做错了什么?

Answer 1:

事实证明我是错误的服用方式来读取资源文件。 不仅我并不需要通过它阻止我获得基础上的CurrentUICulture结果流的工作我的方式。

解决的办法是比我第一次尝试的要容易得多:

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();
      }

}

我希望这有助于任何人试图在未来类似的东西!



文章来源: Dynamically loading a resource and reading the correct value for the CurrentUICulture