GetCustomAttribute返回null

时间:2013-01-11 19:41:21

标签: c# enums custom-attributes

有人可以向我解释为什么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;
    }
}

5 个答案:

答案 0 :(得分:11)

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

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

typeof(Foo).GetField(value.ToString()).GetCustomAttributes...

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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;
    }
}

答案 4 :(得分: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;
    }
}