首页 文章

从描述属性[重复]获取枚举

提问于
浏览
187

可能重复:通过其描述属性查找枚举值

我有一个通用的扩展方法,从 Enum 获取 Description 属性:

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

6 回答

  • 4

    你不能扩展 Enum ,因为它必须自己创建一个静态方法才能做到这一点;当与现有方法结合使用时,以下内容应该有效 GetDescription

    public static class EnumHelper
    {
        public static T GetEnumFromString<T>(string value)
        {
            if (Enum.IsDefined(typeof(T), value))
            {
                return (T)Enum.Parse(typeof(T), value, true);
            }
            else
            {
                string[] enumNames = Enum.GetNames(typeof(T));
                foreach (string enumName in enumNames)
                {  
                    object e = Enum.Parse(typeof(T), enumName);
                    if (value == GetDescription((Enum)e))
                    {
                        return (T)e;
                    }
                }
            }
            throw new ArgumentException("The value '" + value 
                + "' does not match a valid enum name or description.");
        }
    }
    

    它的用法将是这样的:

    Animal giantPanda = EnumHelper.GetEnumFromString<Animal>("Giant Panda");
    
  • 38

    除非您有Web服务,否则解决方案很有效 .

    您需要执行以下操作,因为描述属性不可序列化 .

    [DataContract]
    public enum ControlSelectionType
    {
        [EnumMember(Value = "Not Applicable")]
        NotApplicable = 1,
        [EnumMember(Value = "Single Select Radio Buttons")]
        SingleSelectRadioButtons = 2,
        [EnumMember(Value = "Completely Different Display Text")]
        SingleSelectDropDownList = 3,
    }
    
    public static string GetDescriptionFromEnumValue(Enum value)
    {
            EnumMemberAttribute attribute = value.GetType()
                .GetField(value.ToString())
                .GetCustomAttributes(typeof(EnumMemberAttribute), false)
                .SingleOrDefault() as EnumMemberAttribute;
            return attribute == null ? value.ToString() : attribute.Value;
    }
    
  • 0

    您需要迭代Animal中的所有枚举值,并返回与您需要的描述匹配的值 .

  • 272

    应该非常简单,它只是你以前的方法的反面;

    public static int GetEnumFromDescription(string description, Type enumType)
    {
        foreach (var field in enumType.GetFields())
        {
            DescriptionAttribute attribute
                = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))as DescriptionAttribute;
            if(attribute == null)
                continue;
            if(attribute.Description == description)
            {
                return (int) field.GetValue(null);
            }
        }
        return 0;
    }
    

    用法:

    Console.WriteLine((Animal)GetEnumFromDescription("Giant Panda",typeof(Animal)));
    
  • 2
    public static class EnumEx
    {
        public static T GetValueFromDescription<T>(string description)
        {
            var type = typeof(T);
            if(!type.IsEnum) throw new InvalidOperationException();
            foreach(var field in type.GetFields())
            {
                var attribute = Attribute.GetCustomAttribute(field,
                    typeof(DescriptionAttribute)) as DescriptionAttribute;
                if(attribute != null)
                {
                    if(attribute.Description == description)
                        return (T)field.GetValue(null);
                }
                else
                {
                    if(field.Name == description)
                        return (T)field.GetValue(null);
                }
            }
            throw new ArgumentException("Not found.", "description");
            // or return default(T);
        }
    }
    

    用法:

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

    而不是扩展方法,只需尝试几个静态方法

    public static class Utility
    {
        public static string GetDescriptionFromEnumValue(Enum value)
        {
            DescriptionAttribute attribute = value.GetType()
                .GetField(value.ToString())
                .GetCustomAttributes(typeof (DescriptionAttribute), false)
                .SingleOrDefault() as DescriptionAttribute;
            return attribute == null ? value.ToString() : attribute.Description;
        }
    
        public static T GetEnumValueFromDescription<T>(string description)
        {
            var type = typeof(T);
            if (!type.IsEnum)
                throw new ArgumentException();
            FieldInfo[] fields = type.GetFields();
            var field = fields
                            .SelectMany(f => f.GetCustomAttributes(
                                typeof(DescriptionAttribute), false), (
                                    f, a) => new { Field = f, Att = a })
                            .Where(a => ((DescriptionAttribute)a.Att)
                                .Description == description).SingleOrDefault();
            return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
        }
    }
    

    并在这里使用

    var result1 = Utility.GetDescriptionFromEnumValue(
        Animal.GiantPanda);
    var result2 = Utility.GetEnumValueFromDescription<Animal>(
        "Lesser Spotted Anteater");
    

相关问题