Динамично зареждане на ресурс и четене на правилната стойност за CurrentUICulture

Създавам метод за преобразуване на enum в приятелски низ. Удобните имена се съхраняват във файл с ресурси и подлежат на глобализация. Така че създадох два файла с ресурси: Enums.resx и Enums.pt-BR.resx, чиито ключове са името на enum, последвано от неговата стойност (т.е. DeliveryStatus_WaitingForPayment).

Това е кодът, който използвам, за да заредя ресурса и да получа съответното приятелско име за enum:

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.

какво правя грешно


person Raphael    schedule 26.06.2010    source източник


Отговори (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();
      }

}

Надявам се това да помогне на всеки, който опита нещо подобно в бъдеще!

person Raphael    schedule 26.06.2010