5

有人可以向我解释为什么Value.GetType().GetCustomAttribute退货null吗?我查看了十个关于如何获取枚举类型成员属性的不同教程。无论GetCustomAttribute*我使用哪种方法,都不会返回自定义属性。

using System;
using System.ComponentModel;
using System.Reflection;

public enum Foo
{
    [Bar(Name = "Bar")]
    Baz,
}

[AttributeUsage(AttributeTargets.Field)]
public class BarAttribute : Attribute
{
    public string Name;
}

public static class FooExtensions
{
    public static string Name(this Foo Value)
    {
        return Value.GetType().GetCustomAttribute<BarAttribute>(true).Name;
    }
}
4

5 回答 5

17

因为您尝试检索的属性尚未应用于该类型;它已应用于该领域。

因此,您需要在 FieldInfo 对象上调用它,而不是在类型对象上调用 GetCustomAttributes。换句话说,你需要做更多这样的事情:

typeof(Foo).GetField(value.ToString()).GetCustomAttributes...
于 2013-01-11T19:42:33.500 回答
2

phoog 对问题的解释是正确的。如果您想要一个如何检索枚举值属性的示例,请查看此答案

于 2013-01-11T19:48:37.963 回答
1

您的属性处于字段级别,而Value.GetType().GetCustomAttribute<BarAttribute>(true).Name将返回应用于枚举 Foo 的属性

于 2013-01-11T19:48:18.510 回答
0

我认为您必须像这样重写 FooExtension :

public static class FooExtensions
{
    public static string Name(this Foo Value)
    {
        string rv = string.Empty;
        FieldInfo fieldInfo = Value.GetType().GetField(Value.ToString());
        if (fieldInfo != null)
        {
            object[] customAttributes = fieldInfo.GetCustomAttributes(typeof (BarAttribute), true);
            if(customAttributes.Length>0 && customAttributes[0]!=null)
            {
                BarAttribute barAttribute = customAttributes[0] as BarAttribute;
                if (barAttribute != null)
                {
                    rv = barAttribute.Name;
                }
            }
        }

        return rv;
    }
}
于 2013-01-11T19:58:57.813 回答
0

我最终像这样重写它:

public static class FooExtensions
{
    public static string Name(this Foo Value)
    {
        var Type = Value.GetType();
        var Name = Enum.GetName(Type, Value);
        if (Name == null)
            return null;

        var Field = Type.GetField(Name);
        if (Field == null)
            return null;

        var Attr = Field.GetCustomAttribute<BarAttribute>();
        if (Attr == null)
            return null;

        return Attr.Name;
    }
}
于 2013-01-11T20:01:15.633 回答