0

で属性を参照するにはどうすればよい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
}
4

3 に答える 3

4

次のコードは、.Net 4.5 拡張メソッドGetCustomAttributeを使用して、フィールドのカスタム属性を取得しています。

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

もちろん、フィールドとカスタム属性にnullチェックを追加する必要があります

于 2013-03-17T07:46:37.457 に答える
1

リフレクションを使用できます

例えば:

    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);            
        }
    } 
于 2013-03-17T07:46:33.917 に答える
0

最初に、InadequatyDescribe を 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);
}
于 2013-03-17T07:40:50.787 に答える