如何从值获取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值的能力

我意识到核心答案只是从intMyEnum ,但是如果你在做很多枚举工作,值得考虑使用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);