Pregunta

Estoy creando un método para convertir una enumeración de una serie de usar. Los nombres descriptivos se almacenan en un archivo de recursos, y están sujetas a la globalización. Así que creé dos archivo de recursos: Enums.resx y Enums.pt-BR.resx cuyas claves son el nombre de la enumeración seguido de su valor (es decir DeliveryStatus_WaitingForPayment)

.

Este es el código que estoy usando para cargar el recurso y obtener el nombre descriptivo correspondiente para la enumeración:

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

}

Este método funciona casi a la perfección, excepto que ignora el CurrentUICulture y siempre devuelve los valores del recurso predeterminado, es decir, incluso cuando estoy utilizando pt-BR como mi CurrentUICulture se carga el valor de Enum.resx y no Enum.pt-BR.resx.

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Como resulta que yo estaba tomando un enfoque equivocado para leer el archivo de recursos. No sólo no tenía necesidad de trabajar mi camino a través de una corriente que me impedía conseguir el resultado basado en la CurrentUICulture.

La solución es mucho más fácil que la de mi primer intento:

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

}

Espero que esto ayude a intentar algo similar en el futuro!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top