Ho trovato che il modo migliore per farlo è utilizzare l'attributo System.ComponentModel.Description sui valori enum.
Ecco un esempio:
using System.ComponentModel;
public enum ActionCode
{
[Description("E")]
Edit,
[Description("D")]
Delete,
[Description("R")]
Restore
}
Quindi, per utilizzarlo, creare un metodo di estensione su una classe statica in questo modo:
Edit: ho riscritto il codice originale come un metodo di estensione generica su una classe che implementa IConvertible
(Enum
implementa questa interfaccia, quindi funziona come ne abbiamo bisogno). Ecco un metodo generico che funziona su tutti enumerazioni:
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
}
Quindi, per ottenere la stringa associata con la nostra enum sopra, potremmo utilizzare il seguente codice:
using Your.Extension.Method.Namespace;
...
ActionCode action = ActionCode.Edit;
string actionDescription = action.GetDescription();
// value of actionDescription will be "E"
Ecco un altro Enum campione:
public enum TestEnum
{
[Description("This is test 1")]
Test1,
[Description("This is test 2")]
Test2,
[Description("This is test 3")]
Test3
}
Ecco il codice per vedere la descrizione:
TestEnum test = TestEnum.Test2;
var testDescription = test.GetDescription();
I risultati saranno:
"This is test 2"
volevo andare avanti e inserisci il metodo generico in quanto è molto più utile. Ti impedisce di dover scrivere un'estensione personalizzata per tutte le tue enumerazioni.
Mi sono sfogliato ma non ho visto nulla sull'assegnazione di valori stringa lì. – ediblecode