如何从价值中获取C#Enum描述?

时间:2010-04-16 01:44:00

标签: c# enums

  

可能重复:
  Getting attributes of Enum’s value

我有一个带有这样的描述属性的枚举:

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方法?

5 个答案:

答案 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);

此:

  • 确保(使用泛型类型约束)该值确实是枚举值
  • 避免当前解决方案中的拳击
  • 缓存所有描述以避免在每次调用时使用反射
  • 有许多其他方法,包括解析描述中的值的能力

我意识到核心答案只是从intMyEnum的演员,但是如果你做了大量的工作,那么值得考虑使用无约束旋律:)

答案 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);