switch - 如何從值中獲取C#Enum描述?




enum new c# (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 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);

我在Unconstrained Melody中以一種通用的,類型安全的方式實現了這一點 - 您可以使用:

string description = Enums.GetDescription((MyEnum)value);

這個:

  • 確保(具有泛型類型約束)該值確實是一個枚舉值
  • 避免目前解決方案中的拳擊
  • 緩存所有描述以避免在每次調用時使用反射
  • 有許多其他方法,包括從描述中解析值的能力

我意識到核心答案只是從intMyEnum ,但是如果你正在做很多枚舉工作,那麼值得考慮使用Unconstrained Melody :)


為了使這個更容易使用,我寫了一個通用的擴展:

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

注意:將上面的“枚舉”替換為您的類名稱


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

C#中enum的默認底層數據類型是int ,您可以將其轉換為int





enums