1. ホーム
  2. c#

[解決済み】Description属性からEnumを取得する[重複]。

2022-04-03 01:37:08

質問

<余談
この質問には、すでにここで回答があります :
クローズド 9年前 .

重複の可能性あり。

Description 属性で enum 値を検索する。

を取得する汎用拡張メソッドを持っています。 Description 属性は Enum :

enum Animal
{
    [Description("")]
    NotSet = 0,

    [Description("Giant Panda")]
    GiantPanda = 1,

    [Description("Lesser Spotted Anteater")]
    LesserSpottedAnteater = 2
}

public static string GetDescription(this Enum value)
{            
    FieldInfo field = value.GetType().GetField(value.ToString());

    DescriptionAttribute attribute
            = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                as DescriptionAttribute;

    return attribute == null ? value.ToString() : attribute.Description;
}

だから、私はできる...

string myAnimal = Animal.GiantPanda.GetDescription(); // = "Giant Panda"

今、その逆で同等の関数を考えているところです。

Animal a = (Animal)Enum.GetValueFromDescription("Giant Panda", typeof(Animal));

どのように解決するのですか?

public static class EnumEx
{
    public static T GetValueFromDescription<T>(string description) where T : Enum
    {
        foreach(var field in typeof(T).GetFields())
        {
            if (Attribute.GetCustomAttribute(field,
            typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
            {
                if (attribute.Description == description)
                    return (T)field.GetValue(null);
            }
            else
            {
                if (field.Name == description)
                    return (T)field.GetValue(null);
            }
        }

        throw new ArgumentException("Not found.", nameof(description));
        // Or return default(T);
    }
}

使用方法

var panda = EnumEx.GetValueFromDescription<Animal>("Giant Panda");