2010-05-25 17 views
5

He visto muchas preguntas y respuestas sobre la asignación de cadenas a las enumeraciones y viceversa, pero ¿cómo puedo asignar una serie de cadenas localizadas a las enumeraciones?¿Cómo puedo internacionalizar las cadenas que representan los valores enum de C#?

¿Debo simplemente crear un extension method like this que devuelva la cadena correcta de un archivo de recursos? ¿Hay alguna forma de localizar atributos (como "Descripción") que se usan en solutions like this?

Cuál es la solución preferida - método de extensión o atributos. Me parece que este no es el propósito de los atributos. De hecho, ahora que lo pienso, si tuviera que usar un método de extensión, un atributo parece algo que usaría para especificar una clave en un archivo de recursos para la cadena localizada que quiero usar en lugar del valor enum.

EDITAR - ejemplo:

Dada la siguiente enumeración,

public enum TransactionTypes { 
    Cheque = 1, 
    BankTransfer = 2, 
    CreditCard = 3 
} 

Me gustaría una manera de asignar cada tipo a una cadena localizada. Comencé con un método de extensión para la enumeración que usa una declaración de cambio y referencias fuertemente tipadas al archivo de recursos.

Sin embargo, un método de extensión para cada enumeración no parece una gran solución. Empecé a seguir this para crear un atributo personalizado para cada valor enumerado. El atributo tiene un nombre base y una clave para el archivo de recursos que contiene cadenas localizadas. En la enumeración anterior, por ejemplo, tengo esto:

... 
[EnumResourceAttribute("FinancialTransaction", "Cheque")] 
Cheque = 1, 
... 

Donde "FinanacialTransaction" es la resx y "Check" es la clave de cadena. Intento crear un método de utilidad al cual pueda pasar cualquier valor de cualquier enumeración y hacer que devuelva la representación de cadena localizada de ese valor, suponiendo que se especifique el atributo personalizado. Simplemente no puedo entender cómo acceder dinámicamente a un archivo de recursos y una clave dentro de él.

Respuesta

2

continué con los atributos personalizados y creé este método de utilidad:

public static string getEnumResourceString(Enum value) 
    { 
     System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString()); 
     EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute)); 
     return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key); 
    } 
8

Definitivamente, sugiero usar un archivo de recursos, probablemente con un método (de extensión o de otro tipo) para que sea más fácil obtener el recurso relevante. A medida que crece el número de idiomas que admite, no desea que el código esté lleno de texto, lo que le distrae de los valores.

Del mismo modo las empresas de traducción es probable que se preparaban para manejar archivos resx - no van a querer perder el tiempo en el código fuente, y usted no debe dejar que ellos hagan lo que de todos modos :)

Justo use recursos que están codificados en el nombre de la enumeración y el valor dentro de ella. Directo, escalas a múltiples enumeraciones y múltiples idiomas, no complica su código fuente, funciona bien con las herramientas de traducción, y básicamente va junto con el flujo de i18n dentro de .NET.

EDIT: Para mapear los valores de enumeración de los nombres de recursos, que acababa de hacer algo como:

public static string ToResourceName<T>(this T value) where T : struct 
{ 
    return typeof(T).Name + "." + value; 
} 

Posteriormente, se podría hacer:

string resource = MyEnum.SomeValue.ToResourceName(); 

Obviamente eso es la realización de concatenación de cadenas cada vez - Usted podría caché que si lo desea, pero no me molestaría a menos que tuviera alguna indicación de que realmente era un problema.

Eso no le impide utilizar el método de extensión para no enumerados, por supuesto. Si quieres hacer eso, necesitas algo como Unconstrained Melody.

+0

+1 yo era 1 min demasiado tarde :) –

+0

que debería haber sido más claro - que no iba a usar otra cosa que archivos de recursos (ya los estamos usando para todo lo demás que necesita i18n). Estoy buscando soluciones para mapear las cadenas de recursos para la enumeración. – Matt

+0

@Duke: Está bien, no está muy claro lo que quieres entonces - He actualizado mi respuesta con un método de extensión muy simple, pero sospecho que buscas algo más que eso ... –

Cuestiones relacionadas