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