Sostituisci il metodo di @ nairik con quanto segue per aggiungere supporto per enumerazioni di flag.
public static string GetLocalizedDescription(this Enum @enum)
{
if (@enum == null)
return null;
StringBuilder sbRet = new StringBuilder();
string description = @enum.ToString();
var fields = description.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var field in fields)
{
FieldInfo fieldInfo = @enum.GetType().GetField(field);
DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Any())
sbRet.AppendFormat("{0}, ", attributes[0].Description);
else
sbRet.AppendFormat("{0}, ", field);
}
if (sbRet.Length > 2)
sbRet.Remove(sbRet.Length - 2, 2);
return sbRet.ToString();
}
e sostituire NameResourceType nell'attributo:
public Type NameResourceType
{
get
{
return _resourceType;
}
set
{
_resourceType = value;
_nameProperty = _resourceType.GetProperty(base.Description, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
}
}
un Enum non è un enumeratore, vero? È un tipo enumerato, ma un enumeratore è qualcosa di molto diverso, credo ... – Svish
Usando C# 3.5, puoi fare di quel metodo un metodo di estensione in modo che tu possa usare SomeEnum.Large.EnumDescription(); –
Si è appena imbattuto in questa domanda durante la ricerca di un altro problema. Vorrei solo ricordare che l'uso del tipo e dei nomi dei membri rende l'applicazione più difficile da offuscare (è necessario escludere la dichiarazione sensibile dal processo). –