我有一个带有这样的描述属性的枚举:
public enum MyEnum
{
Name1 = 1,
[Description("Here is another")]
HereIsAnother = 2,
[Description("Last one")]
LastOne = 3
}
我找到了一些用于根据Enum
检索描述的代码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方法?
答案 0 :(得分:326)
int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);
C#中enum
的默认基础数据类型是int
,您可以直接投射它。
答案 1 :(得分:81)
不再维护无约束旋律库;支持被取消,有利于Enums.NET。
在Enums.NET中,您将使用:
string description = ((MyEnum)value).AsString(EnumFormat.Description);
我在Unconstrained Melody中以通用,类型安全的方式实现了这一点 - 您将使用:
string description = Enums.GetDescription((MyEnum)value);
此:
我意识到核心答案只是从int
到MyEnum
的演员,但是如果你做了大量的工作,那么值得考虑使用无约束旋律:)
答案 2 :(得分:70)
我将代码放在一般扩展方法中的接受答案中,因此它可以用于各种对象:
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();
}
使用原始帖子中的枚举,或其属性使用Description属性修饰的任何其他类,代码可以像这样使用:
string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();
答案 3 :(得分:28)
为了使这更容易使用,我写了一个通用扩展名:
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);
注意:将上面的“Enumerations”替换为您的班级名称
答案 4 :(得分:7)
您无法以通用方式轻松执行此操作:您只能将整数转换为特定类型的枚举。正如尼古拉斯所表明的那样,如果你只关心一种枚举,这是一个微不足道的演员,但如果你想写一个能处理不同类型枚举的通用方法,事情会变得复杂一些。你想要一个方法:
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
}
现在可以调用它来获取任何类型的枚举的描述:
GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);