可能重复:
获取Enum值的属性
我有一个带有Description属性的枚举,如下所示:
public enum MyEnum
{
Name1 = 1,
[Description("Here is another")]
HereIsAnother = 2,
[Description("Last one")]
LastOne = 3
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些用于根据Enum检索描述的代码
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];
if (attributes != null && attributes.Any())
{
return attributes.First().Description;
}
return value.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这允许我编写如下代码:
var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };
Run Code Online (Sandbox Code Playgroud)
我想要做的是,如果我知道枚举值(例如1) - 我该如何检索描述?换句话说,如何将整数转换为"枚举值"以传递给我的GetDescription方法?
Nic*_*cki 344
int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);
Run Code Online (Sandbox Code Playgroud)
enumC#中的默认底层数据类型是a int,你可以直接转换它.
Jon*_*eet 88
无约束旋律图书馆不再维护; 支持被删除,有利于Enums.NET.
在Enums.NET中,您将使用:
string description = ((MyEnum)value).AsString(EnumFormat.Description);
Run Code Online (Sandbox Code Playgroud)
我在Unconstrained Melody中以通用的,类型安全的方式实现了这个- 你使用:
string description = Enums.GetDescription((MyEnum)value);
Run Code Online (Sandbox Code Playgroud)
这个:
我认识的核心答案是刚刚从投int来MyEnum,但如果你做了很多枚举的工作,这是值得考虑使用无约束的旋律:)
小智 79
我将代码放在通用扩展方法中的接受答案中,因此它可以用于所有类型的对象:
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();
}
Run Code Online (Sandbox Code Playgroud)
使用原始帖子中的枚举或其属性使用Description属性修饰的任何其他类,代码可以像这样使用:
string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 30
为了使这更容易使用,我写了一个通用扩展:
public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}
Run Code Online (Sandbox Code Playgroud)
现在我可以写:
MyEnum my = MyEnum.HereIsAnother;
string description = my.ToDescription();
System.Diagnostics.Debug.Print(description);
Run Code Online (Sandbox Code Playgroud)
注意:将上面的"Enumerations"替换为您的班级名称
您不能以通用方式轻松执行此操作:您只能将整数转换为特定类型的枚举.正如尼古拉斯所表明的那样,如果你只关心一种枚举,这是一个微不足道的演员,但如果你想写一个能处理不同类型枚举的通用方法,事情会变得复杂一些.你想要一个方法:
public static string GetEnumDescription<TEnum>(int value)
{
return GetEnumDescription((Enum)((TEnum)value)); // error!
}
Run Code Online (Sandbox Code Playgroud)
但这会导致编译器错误"int无法转换为TEnum"(如果您解决此问题,那么"TEnum无法转换为Enum").所以你需要通过向对象插入强制转换来欺骗编译器:
public static string GetEnumDescription<TEnum>(int value)
{
return GetEnumDescription((Enum)(object)((TEnum)(object)value)); // ugly, but works
}
Run Code Online (Sandbox Code Playgroud)
您现在可以调用它来获取任何类型的枚举的描述:
GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
409153 次 |
| 最近记录: |