Динамическая загрузка ресурса и чтение правильного значения для CurrentUICulture - PullRequest
1 голос
/ 26 июня 2010

Я создаю метод для преобразования enum в дружественную строку.Дружественные имена хранятся в файле ресурсов и подвержены глобализации.Поэтому я создал два файла ресурсов: 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.

Что я делаю не так?

1 Ответ

1 голос
/ 26 июня 2010

Как оказалось, я неправильно выбрал способ чтения файла ресурсов.Мало того, что мне не нужно было прокладывать себе путь через поток, это мешало мне получить результат на основе 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();
      }

}

Надеюсь, это поможет любому, кто попробует что-то подобное в будущем!

...