我有一个通用的扩展方法,该方法从中获取Description属性Enum:
Description
Enum
enum Animal { [Description("")] NotSet = 0, [Description("Giant Panda")] GiantPanda = 1, [Description("Lesser Spotted Anteater")] LesserSpottedAnteater = 2 } public static string GetDescription(this Enum value) { FieldInfo field = value.GetType().GetField(value.ToString()); DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; return attribute == null ? value.ToString() : attribute.Description; }
所以我可以做…
string myAnimal = Animal.GiantPanda.GetDescription(); // = "Giant Panda"
现在,我正在尝试在另一个方向上实现等效功能,例如…
Animal a = (Animal)Enum.GetValueFromDescription("Giant Panda", typeof(Animal));
public static class EnumEx { public static T GetValueFromDescription(string description) { var type = typeof(T); if(!type.IsEnum) throw new InvalidOperationException(); foreach(var field in type.GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if(attribute != null) { if(attribute.Description == description) return (T)field.GetValue(null); } else { if(field.Name == description) return (T)field.GetValue(null); } } throw new ArgumentException(“Not found.”, nameof(description)); // or return default(T); } }
用法:
var panda = EnumEx.GetValueFromDescription<Animal>("Giant Panda");