Carga dinámica de un recurso y leer el valor correcto para el CurrentUICulture
-
30-09-2019 - |
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?
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!