Descubrí que la mejor manera de hacerlo es mediante el uso del atributo System.ComponentModel.Description en los valores enum.
Aquí se muestra un ejemplo:
using System.ComponentModel;
public enum ActionCode
{
[Description("E")]
Edit,
[Description("D")]
Delete,
[Description("R")]
Restore
}
Entonces, para usarlo, crear un método de extensión en una clase estática, así:
Edición: He reescrito el código original como un método de extensión genérica en una clase que implementa IConvertible
(Enum
implementa esta interfaz, por lo que funciona de la manera que lo necesitamos). Aquí es un método genérico que funciona en todos enumeraciones:
public static string GetDescription<T>(this T e) where T : IConvertible
{
if (e is Enum)
{
Type type = e.GetType();
Array values = System.Enum.GetValues(type);
foreach (int val in values)
{
if (val == e.ToInt32(CultureInfo.InvariantCulture))
{
var memInfo = type.GetMember(type.GetEnumName(val));
var descriptionAttribute = memInfo[0]
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute;
if (descriptionAttribute != null)
{
return descriptionAttribute.Description;
}
}
}
}
return null; // could also return string.Empty
}
lo tanto, para obtener la cadena asociada con nuestra enumeración anterior, se podría utilizar el siguiente código:
using Your.Extension.Method.Namespace;
...
ActionCode action = ActionCode.Edit;
string actionDescription = action.GetDescription();
// value of actionDescription will be "E"
aquí es otra enumeración de muestra:
public enum TestEnum
{
[Description("This is test 1")]
Test1,
[Description("This is test 2")]
Test2,
[Description("This is test 3")]
Test3
}
Este es el código para ver la descripción:
TestEnum test = TestEnum.Test2;
var testDescription = test.GetDescription();
Los resultados serán:
"This is test 2"
quería seguir adelante y publicar el método genérico, ya que es mucho más útil. Le impide tener que escribir una extensión personalizada para todas sus enums.
Revisé pero no vi nada sobre la asignación de valores de cadena allí. – ediblecode