2010-06-04 29 views
5

Usando VS2010 y .NET V4.0 me gustaría lograr lo siguiente:C# String Resource Values ​​como Enum String Part values?

ya tengo 2 archivos de recursos en mi proyecto para 2 idiomas - Inglés y Checo.

tengo que decir que la Gestión de Recursos en .NET es excelente, estoy sorprendido incluso para conseguir la finalización de código en la aplicación de una cadena, por ejemplo:

string desc = Strings.ResourceManagerDesc 

Esto tiene la cadena asociada con la cultura actual del subproceso.

Ahora estoy tratando de crear un Enum que pueda tener la parte de Cadena de Enum interpretada desde los recursos de Cadenas. De la siguiente manera (Este código no funciona):

public enum DownloadStatus 
{ 
1 = Strings.DownloadState_Complete, 
2 = Strings.DownloadState_Failed, 
3 = Strings.DownloadState_InProgress 
} 

Esta es una compuesta por ejemplo, pero se puede ver el punto aquí. Dado que el código anterior no funcionará, ¿existe una forma de mejores prácticas para lograr lo que quiero?

+0

¿Qué estás tratando de lograr exactamente? –

+0

@ Robert, digamos que tenía una enumeración típica que contiene los valores de sus marcas, listos, vaya - ahora cuando hago un myEnum.ToString() consigo el valor de cadena listos, listos, ya impreso (dependiendo de si enumeración es 1,2 , 3). Lo que intento hacer es localizar este valor de cadena dependiendo de la cultura, Enum.ToString debe imprimir el valor basado en la cultura actual. –

+0

@JL agregó una respuesta que localiza una enumeración. Tenga en cuenta que no puede localizar cadenas enum con Enum.ToString(), pero puede lograr la localización a través de un método para convertir una enumeración en una cadena de recursos, que luego puede recuperar de los recursos. –

Respuesta

8

Esta pregunta es viejo, pero no tiene una respuesta aceptada y que estaba buscando una buena manera de hacer esto.

Aquí es lo que hice, he construido una extensión a mi Enum para que devuelva un valor del Administrador de recursos:

public enum EventType 
    { 
     NewVersion = 1, 
     Accepted = 2, 
     Rejected = 3, 
     BruteForce = 4 
    } 

    public static class EventTypeExtension 
    { 
     public static string Display(this EventType type) 
     { 
      return Strings.ResourceManager.GetString("EventType_" + type); 
     } 
    } 

Espero que esto pueda ayudar a alguien!

1

Las enumeraciones se compilan como parte del ensamblaje. Básicamente se está asignando un método al valor de la enumeración no es de un valor constante - el CLR no es lo suficientemente inteligente como para calcular el valor en tiempo de compilación, debe ser una constante.

Sugiero que cree una enumeración diferente para cada idioma (olvide los recursos) y use una clase auxiliar para devolver la correcta según el contexto de idioma que necesite.

+0

¿De todos modos tener un recurso estático? –

+0

Creo que este es el quid de la cuestión, sin asignación dinámica, no importa qué (recurso o cualquier otro campo dinámico). Así que supongo que Enum es la herramienta equivocada para el trabajo en este caso. –

+0

Pero esto seguiría siendo el comportamiento del tiempo de ejecución, no el tiempo de compilación de la enumeración. –

1

Las enumeraciones no pueden heredar de cadenas. En el código, no necesita preocuparse por el idioma del código, por lo que su enumeración puede contener simplemente los estados relevantes.

Parece que lo que necesita es un método de utilidad para convertir el valor enum a la representación de cadena relevante; simplemente haga un método para esto.

EDITAR: cuando utiliza una enumeración para activar casos, pero necesita más información por valor enumerado, tiendo a soltar la enumeración y crear una serie de referencias estáticas y utilizarlas en el cheque en su lugar. Esta referencia puede ser una clase que envuelve un valor enum, que luego podría exponer títulos o descripciones útiles.

+0

Los mensajes no pueden heredar de nada. Todos ellos heredan de System.Enum. En cualquier caso, en el ejemplo anterior, OP está basando su enumeración en el valor predeterminado de int. El problema es que está tratando de asignar dinámicamente el valor de la enumeración. –

+0

Mantendré la pregunta abierta por el momento, tuve en cuenta su sugerencia, pero podría ser posible que haya una solución más limpia, gracias Adam. –

+0

Lo siento, supongo que no pueden heredar. Pero pueden especificar un tipo: public enum MyShorts: short {} –

1

Puede obtener un recurso a través de una cadena, y ya que puede convertir una enumeración en una cadena, esto es bastante sencillo.

enum Whatever { Ready, Set, Go } 

public static string GetEnumerationString(Enum enumeration) 
{ 
    string resourceName = 
     string.Concat(enumeration.GetType().Name, "_", enumeration); 
    return ResourceManager.GetString(resourceName); 
} 

Ahora, en esta aplicación que prefijar todos los recursos de enumeración con el nombre de la enumeración. En un proyecto que hicimos, simplemente evita colisiones con otros recursos y los hace fáciles de encontrar. Debería asegurarse de agregar recursos llamados Whatever_Ready, Whatever_Set y Whatever_Go.

Del mismo modo, si usted fuera a mirar el código generado para las cadenas de miembros estáticos como los escribió originalmente probablemente vería:

public static string DownloadStatus_Complete 
{ 
    return ResourceManager.GetString("DownloadStatus_Complete", Resource.Culture); 
} 
0

OMI, el valor de enumeración debe reflejarse en el dominio y debe no específico de la IU (contexto del lenguaje).

Es posible que desee hacer como esto

public enum DownloadStatus 
{ 
    Complete = 1, 
    Failed = 2, 
    InProgress = 3 
} 

y el uso de algún método EnumHelper para conseguir la cultura descripción específica en la capa de interfaz de usuario

var downloadStatusString = EnumHelper.GetDescription<DownloadStatus>(DownloadStatus.Complete); 

y EnumHelper clase leerá la cadena específica cultura de la archivo de recursos

public static class EnumHelper 
{ 
    public static string GetDescription<T>(T value) 
     where T : struct 
    { 
     if (!typeof(T).IsEnum) 
     { 
      throw new ArgumentException("value must be Enum.", "value"); 
     } 

     var name = value.ToString(); 

     string resourceKey = string.Format(CultureInfo.InvariantCulture, "{0}_{1}", typeof(T).FullName, name); 

     object resource = HttpContext.GetGlobalResourceObject("EnumDescriptions", resourceKey, Thread.CurrentThread.CurrentUICulture); 
     string description = resource as string ?? name; 
     return description; 
    } 
} 

Nota: el nombre del archivo de recursos es EnumDescriptions y la clave debe ser esta conversión YourNamespace.EnumType_EnumValueInString. (estoy usando HttpContext para obtener el valor de los recursos y puede que desee cambiar si no está utilizando ASP.Net.)

+0

su uso de genéricos es quizás excesivo y no es necesario. Todas las enumeraciones son del tipo 'Enum'. No desea llamar a string.Format solo para concatenar 2 cadenas. –

Cuestiones relacionadas