Mi enumeración consta de los siguientes valores:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Sin embargo, quiero poder generar estos valores de una manera fácil de usar.
No necesito poder pasar de cadena a valor nuevamente.
Respuestas:
Yo uso el
Description
atributo del espacio de nombres System.ComponentModel. Simplemente decora la enumeración:Luego use este código para recuperarlo:
fuente
ArgumentException
, entonces no hay razón para que el método sea totalmente genérico.Hago esto con métodos de extensión:
fuente
default
implementación del caso regreseme.ToString()
y solo proporcionar declaraciones de casos de cambio para los valores de enumeración que desea anular. En su ejemplo, entiendo que todos son diferentes, pero en casos de uso real, sospecho que la mayoría de los valores de enumeración de una sola palabra serán suficientes y solo proporcionará anulaciones para los valores de enumeración de varias palabras.Tal vez me estoy perdiendo algo, pero ¿qué hay de malo en Enum.GetName?
editar: para cadenas fáciles de usar, debe pasar por un recurso .resource para realizar la internacionalización / localización, y podría decirse que sería mejor usar una clave fija basada en la clave enum que un atributo decorador en la misma.
fuente
Creé un método de extensión inversa para convertir la descripción nuevamente en un valor de enumeración:
fuente
La solución más fácil aquí es utilizar un método de extensión personalizado (al menos en .NET 3.5, simplemente puede convertirlo en un método auxiliar estático para versiones anteriores de framework).
Supongo aquí que desea devolver algo más que el nombre real del valor de enumeración (que puede obtener simplemente llamando a ToString).
fuente
Esa otra publicación es Java. No puede poner métodos en Enums en C #.
solo haz algo como esto:
Si desea usar diferentes valores de visualización para sus valores de enumeración, puede usar Atributos y Reflexión.
fuente
La forma más simple es incluir esta clase de extensión en su proyecto, funcionará con cualquier enumeración en el proyecto:
Uso:
...
fuente
string result = "Result: " + ee;
Algunas otras opciones más primitivas que evitan clases / tipos de referencia:
Método de matriz
Uso
Método de estructura anidada
Uso
Actualización (03/09/2018)
Un híbrido de métodos de extensión y la primera técnica anterior.
Prefiero que las enumeraciones se definan donde "pertenecen" (más cercanas a su fuente de origen y no en un espacio de nombres global común).
El método de extensión parece adecuado para un área común, y la definición "localizada" de la enumeración ahora hace que el método de extensión sea más detallado.
Un ejemplo de uso de la enumeración y su método de extensión.
Nota: en realidad decidí eliminar el
Enum
contenedor (y laName
matriz), ya que es mejor que las cadenas de nombre provengan de un recurso (es decir, un archivo de configuración o DB) en lugar de estar codificadas, y porque terminé poniendo el método de extensión en elViewModels
espacio de nombres (solo en un archivo diferente, "CommonVM.cs"). Además, todo se.Id
vuelve molesto y molesto.CommonVM.cs
Un ejemplo de uso de la enumeración y su método de extensión.
fuente
Puede utilizar Humanizer paquete con Humanize enumeraciones posibilidad. Un ejemplo:
entonces puede usar el
Humanize
método de extensión en enum directamente:fuente
Con respecto a Ray Booysen, hay un error en el código: Enum ToString con cadenas fáciles de usar
Debe tener en cuenta varios atributos en los valores de enumeración.
fuente
fuente
this
parámetro en los métodos de extensión, que puede ver llamadoThis
en muchos ejemplos en la web. Llamarlo como su tipo como lo hiciste (Enum Enum
) hace que el código sea menos legible.En lugar de usar una enumeración, use una clase estática.
reemplazar
con
se usará así
Problema con las principales soluciones de "método de extensión":
Una enumeración privada a menudo se usa dentro de otra clase. La solución del método de extensión no es válida allí ya que debe estar en su propia clase. Esta solución puede ser privada e incrustada en otra clase.
fuente
Resulta que soy un fanático de VB.NET, así que aquí está mi versión, combinando el método DescripciónAtributo con un método de extensión. Primero, los resultados:
Material básico: una enumeración llamada EnumType con tres valores V1, V2 y V3. La "magia" ocurre en la llamada Console.WriteLine en Sub Main (), donde el último argumento es simple
v.Description
. Esto devuelve "Uno" para V1, "V2" para V2 y "Tres" para V3. Este método de descripción es, de hecho, un método de extensión, definido en otro módulo llamado EnumExtensions:Debido a que la búsqueda de atributos de descripción
Reflection
es lenta, las búsquedas también se almacenan en caché en privadoDictionary
, que se completa bajo demanda.(Perdón por la solución VB.NET: debería ser relativamente sencillo traducirlo a C #, y mi C # está oxidado en temas nuevos como extensiones)
fuente
Resumen limpio de las sugerencias anteriores con muestra:
USO:
fuente
Utilice Enum.GetName
Desde el enlace de arriba ...
fuente
De acuerdo con esta documentación: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Es posible convertir un enumerador a cadena usando un formato como este:
Puede ver todos los formatos posibles en este enlace: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
fuente
Esta es una actualización del código de Ray Booysen que usa el método genérico GetCustomAttributes y LINQ para hacer las cosas un poco más ordenadas.
fuente
Resumen aún más limpio:
El mismo uso que el subrayado describe.
fuente
Para banderas enum incluidas.
fuente
En caso de que solo desee agregar un espacio en blanco entre las palabras, es tan simple como
fuente
Utilizo una clase genérica para almacenar los pares enum / description y una clase auxiliar anidada para obtener la descripción.
La enumeración :
La clase genérica:
Nota: Dado que una clase genérica no puede estar limitada por una enumeración , estoy restringiendo por estructura en su lugar y comprobando la enumeración en el constructor.
Uso:
fuente
Creo que la mejor (y más fácil) forma de resolver su problema es escribir un Método de extensión para su enumeración:
fuente
Si quieres algo completamente personalizable, prueba mi solución aquí:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Básicamente, la publicación describe cómo adjuntar atributos de Descripción a cada una de sus enumeraciones y proporciona una forma genérica de asignar de enumeración a descripción.
fuente