如何从值获取C#枚举说明?
可能重复:
获取Enum的值的属性
我有一个像这样的描述属性的枚举:
public enum MyEnum { Name1 = 1, [Description("Here is another")] HereIsAnother = 2, [Description("Last one")] LastOne = 3 }
我发现这一点的代码来检索基于枚举的描述
public static string GetEnumDescription(Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) return attributes[0].Description; else return value.ToString(); }
这使我可以编写如下代码:
var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum)) select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };
我想要做的是如果我知道枚举值(例如1) – 如何检索描述? 换句话说,如何将一个整数转换为“枚举值”传递给我的GetDescription方法?
int value = 1; string description = Enumerations.GetEnumDescription((MyEnum)value);
C#中enum
的默认底层数据types是int
,您可以将其转换为。
我在Unconstrained Melody中以一种通用的,types安全的方式实现了这一点 – 你可以使用:
string description = Enums.GetDescription((MyEnum)value);
这个:
- 确保(具有genericstypes约束)该值实际上是一个枚举值
- 避免目前的解决scheme拳击
- caching所有描述以避免在每次调用时使用reflection
- 有一堆其他方法,包括从描述中parsing值的能力
我意识到核心答案只是从int
到MyEnum
,但是如果你在做很多枚举工作,值得考虑使用Unconstrained Melody 🙂
我把代码放在一个通用的扩展方法的接受答案,所以它可以用于各种对象:
public static string DescriptionAttr<T>(this T source) { FieldInfo fi = source.GetType().GetField(source.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) return attributes[0].Description; else return source.ToString(); }
使用原始文章中的枚举或任何其他具有“描述”属性装饰的属性的代码,代码可以像这样被使用:
string enumDesc = MyEnum.HereIsAnother.DescriptionAttr(); string classDesc = myInstance.SomeProperty.DescriptionAttr();
为了使这个更容易使用,我写了一个通用的扩展:
public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct { return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue)); }
现在我可以写:
MyEnum my = MyEnum.HereIsAnother; string description = my.ToDescription(); System.Diagnostics.Debug.Print(description);
注意:用你的class级名称replace上面的“枚举”
您不能以通用的方式轻松完成此操作:只能将整数转换为特定types的枚举。 正如尼古拉斯所表明的,如果你只关心一种枚举,那么这是一个微不足道的小事,但是如果你想写一个可以处理不同types枚举的通用方法,事情就会变得复杂一些。 你需要一个方法:
public static string GetEnumDescription<TEnum>(int value) { return GetEnumDescription((Enum)((TEnum)value)); // error! }
但是这会导致一个编译器错误,“int不能转换为TEnum”(如果你解决这个问题,那个“TEnum不能被转换成Enum”)。 所以你需要通过插入强制转换对象来欺骗编译器:
public static string GetEnumDescription<TEnum>(int value) { return GetEnumDescription((Enum)(object)((TEnum)(object)value)); // ugly, but works }
您现在可以调用这个来获取任何types的枚举的描述:
GetEnumDescription<MyEnum>(1); GetEnumDescription<YourEnum>(2);