谁能给我解释一下为什么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;
}
}
因为您试图检索的属性尚未应用于该类型;已应用于现场。
因此,不是在类型对象上调用GetCustomAttributes,而是需要在FieldInfo对象上调用它。换句话说,您需要做这样的事情:
typeof(Foo).GetField(value.ToString()).GetCustomAttributes...
phog对问题的解释是正确的。如果您想要一个关于如何检索枚举值的属性的示例,请查看这个答案。
您的属性处于字段级别,而Value.GetType().GetCustomAttribute<BarAttribute>(true).Name
将返回应用于enum Foo的属性
最后我这样重写了:
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;
}
}
我认为你必须这样重写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;
}
}