J'ai fusionné un couple de réponses ici pour créer un peu plus extensible solution. Je suis fournissant juste au cas où c'est utile à quelqu'un d'autre dans l'avenir. Message Original ici.
using System;
using System.ComponentModel;
public static class EnumExtensions {
// This extension method is broken out so you can use a similar pattern with
// other MetaData elements in the future. This is your base method for each.
public static T GetAttribute<T>(this Enum value) where T : Attribute {
var type = value.GetType();
var memberInfo = type.GetMember(value.ToString());
var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
return (T)attributes[0];
}
// This method creates a specific call to the above method, requesting the
// Description MetaData attribute.
public static string ToName(this Enum value) {
var attribute = value.GetAttribute<DescriptionAttribute>();
return attribute == null ? value.ToString() : attribute.Name;
}
}
Cette solution crée une paire de méthodes d'extension sur le protocole Enum. La première vous permet d'utiliser la réflexion pour récupérer tous les attributs associés à votre valeur. Le second spécifiquement appels récupère l' DisplayAttribute
, et le renvoie de l' Name
de la valeur.
Considérez, par exemple, à l'aide de l' DisplayAttribute
de l'attribut de System.ComponentModel.DataAnnotations
using System.ComponentModel.DataAnnotations;
public enum Days {
[Display(Name = "Sunday")]
Sun,
[Display(Name = "Monday")]
Mon,
[Display(Name = "Tuesday")]
Tue,
[Display(Name = "Wednesday")]
Wed,
[Display(Name = "Thursday")]
Thu,
[Display(Name = "Friday")]
Fri,
[Display(Name = "Saturday")]
Sat
}
Pour utiliser l'extension de la méthode, on doit maintenant appeler tout simplement la suivante:
Console.WriteLine(Days.Mon.ToName());
ou
var day = Days.Mon;
Console.WriteLine(day.ToName());