如何获取枚举的自定义属性值?
我有一个枚举,其中每个成员都有一个自定义属性应用于它。我如何检索存储在每个属性中的值?如何获取枚举的自定义属性值?
现在我这样做:
var attributes = typeof (EffectType).GetCustomAttributes (false);
foreach (object attribute in attributes)
{
GPUShaderAttribute attr = (GPUShaderAttribute) attribute;
if (attr != null)
return attr.GPUShader;
}
return 0;
的另一个问题是,如果它没有找到,我应该怎么回报? 0是可转换为任何枚举,对吗?这就是为什么我回来的原因。
忘了提及,上面的代码为每个枚举成员返回0。
这是一个有点乱做你正在尝试做的,你必须使用反射:
public GPUShaderAttribute GetGPUShader(EffectType effectType)
{
MemberInfo memberInfo = typeof(EffectType).GetMember(effectType.ToString())
.FirstOrDefault();
if (memberInfo != null)
{
GPUShaderAttribute attribute = (GPUShaderAttribute)
memberInfo.GetCustomAttributes(typeof(GPUShaderAttribute), false)
.FirstOrDefault();
return attribute;
}
return null;
}
这将返回GPUShaderAttribute
,是有关一对EffectType
枚举值标记的实例。你必须把它的EffectType
枚举的特定值:
GPUShaderAttribute attribute = GetGPUShader(EffectType.MyEffect);
一旦你的属性的情况下,你可以得到的具体数值出它是对个人枚举值标记的。
谢谢你,它的工作原理。我不知道这会变得如此复杂。但这是最简单的方法,对吧?你也知道为什么我的版本不起作用。我认为,因为枚举不能被实例化,所以使用enum.getCustomAttributes会起作用。 – 2011-02-23 22:32:05
@Joan:据我所知,这是最简单的方法。你的方法不工作,因为你正在获取在枚举类型上定义的属性,而不是类型的值。 – adrianbanks 2011-02-23 22:35:31
谢谢阿德里安,现在有道理。 – 2011-02-23 22:45:11
有泛型做到这一点的另一种方法:
public static T GetAttribute<T>(Enum enumValue) where T: Attribute
{
T attribute;
MemberInfo memberInfo = enumValue.GetType().GetMember(enumValue.ToString())
.FirstOrDefault();
if (memberInfo != null)
{
attribute = (T) memberInfo.GetCustomAttributes(typeof (T), false).FirstOrDefault();
return attribute;
}
return null;
}
我喜欢这个,但是没有考虑到具有相同属性的多个实例的可能性。我把你所拥有的修改为使用T []而不是T,然后删除GetCustomAttributes上的FirstOrDefault()。 – 2015-07-25 22:54:15
尝试使用泛型方法
属性:
class DayAttribute : Attribute
{
public string Name { get; private set; }
public DayAttribute(string name)
{
this.Name = name;
}
}
枚举:
enum Days
{
[Day("Saturday")]
Sat,
[Day("Sunday")]
Sun,
[Day("Monday")]
Mon,
[Day("Tuesday")]
Tue,
[Day("Wednesday")]
Wed,
[Day("Thursday")]
Thu,
[Day("Friday")]
Fri
}
泛型方法:
public static TAttribute GetAttribute<TAttribute>(this Enum value) where TAttribute : Attribute { var enumType = value.GetType(); var name = Enum.GetName(enumType, value); return enumType.GetField(name).GetCustomAttributes(false).OfType<TAttribute>().SingleOrDefault(); }
调用:
static void Main(string[] args)
{
var day = Days.Mon;
Console.WriteLine(day.GetAttribute<DayAttribute>().Name);
Console.ReadLine();
}
结果:
周一
[我应该使用什么AttributeTarget为枚举成员?(HTTP的希望我可以upvote这个答案100次!好东西 :-) – Gericke 2018-03-01 20:44:10
可能重复://计算器.com/questions/5032774/what-attributetarget-should-i-use-for-enum-members) – 2011-02-23 22:14:02
不,这是不同的。在这里,我只是试图使用反射来获取在枚举成员上设置的自定义属性。 – 2011-02-23 22:16:40
[获取Enum的值的属性]的可能的重复(http://stackoverflow.com/questions/1799370/getting-attributes-of-enums-value) – 2012-01-23 10:25:06