获取枚举值 - 如何从值中获取C#Enum描述?




enum菜鸟 (4)

可能重复:
获取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方法?


为了使这个更容易使用,我写了一个通用的扩展:

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

注意:将上面的“枚举”替换为您的类名称


您不能以通用的方式轻松完成此操作:只能将整数转换为特定类型的枚举。 正如尼古拉斯所表明的,如果你只关心一种枚举,那么这是一个微不足道的表现,但是如果你想写一个可以处理不同类型枚举的泛型方法,事情会变得更复杂一些。 你需要一个方法:

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

我把这些代码放在一个通用的扩展方法中,这样它就可以用于各种对象:

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();

int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

C#中enum的默认底层数据类型是int ,您可以将其转换为int





enums