如何在枚举中引用属性?

时间:2013-03-17 07:37:23

标签: c# .net vb.net enums attributes

如何在enums中引用属性?

如果我有以下enum类型,如何引用此枚举类型的特定值的属性?

public enum PersonGender
{
    Unknown = 0,
    Male = 1,
    Female = 2,
    Intersex = 3,
    Indeterminate = 3,

    [EnumMember("Not Stated")]
    NonStated = 9,

    [EnumMember("Inadequately Described")]
    InadequatelyDescribed = 9
}

3 个答案:

答案 0 :(得分:4)

以下代码使用.Net 4.5扩展方法GetCustomAttribute来获取字段

的自定义属性
Type enumType = typeof(PersonGender);
var value = enumType.GetField(PersonGender.NonStated.ToString())
                    .GetCustomAttribute<EnumMemberAttribute>().Value; 
// returns "Not Stated"

当然,您应该为字段和自定义属性添加空检查

答案 1 :(得分:1)

您可以使用Reflection

例如:

    class EnumMemberAttribute : Attribute
    {
        private String name;

        public String Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        public EnumMemberAttribute(String name)
        {
            this.name = name;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(PersonGender);
            MemberInfo[] members = type.GetMember(PersonGender.NonStated.ToString());
            Object[] attributes = members[0].GetCustomAttributes(typeof(EnumMemberAttribute),
                false);
            Console.WriteLine(((EnumMemberAttribute)attributes[0]).Name);            
        }
    } 

答案 2 :(得分:0)

首先,将InadequatelyDescribed设置为NonStated以外的其他值。

其次,EnumMembers的正确语法是

[EnumMember(Value = "Not Stated")]

这是解决方案 - 在 .NET 4.0 以及4.5中工作:

PersonGender pg = PersonGender.InadequatelyDescribed;
string pgName = Enum.GetName(typeof(PersonGender), pg);

var t = typeof(PersonGender);
var info = t.GetMember(pgName);
var att = info[0].GetCustomAttributes(typeof(EnumMemberAttribute), false);

if (att.Length > 0)
{
    Console.WriteLine(((EnumMemberAttribute)att[0]).Value);
}
else
{
    Console.WriteLine(pgName);
}