如何创build重复的允许的属性
我正在使用从属性类inheritance的自定义属性。 我正在使用它:
[MyCustomAttribute("CONTROL")] [MyCustomAttribute("ALT")] [MyCustomAttribute("SHIFT")] [MyCustomAttribute("D")] public void setColor() { }
但显示“重复的”MyCustomAttribute属性“错误。
我如何创build一个重复的允许的属性?
将一个AttributeUsage
属性粘贴到你的属性类(是的,这是一口),并将AllowMultiple
设置为true
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public sealed class MyCustomAttribute: Attribute
AttributeUsageAttribute ;-p
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class MyAttribute : Attribute {}
但是请注意,如果您使用的是ComponentModel( TypeDescriptor
),则它仅支持每个成员的一个属性实例(每个属性types) 原始reflection支持任何数字…
安东的解决scheme是正确的,但还有一个问题 。
简而言之,除非您的自定义属性覆盖TypeId,否则通过PropertyDescriptor.GetCustomAttributes()访问它只会返回属性的单个实例。
作为替代scheme,考虑重新devise属性以允许序列。
[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
要么
[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
然后parsing这些值来configuration您的属性。
有关此示例,请访问www.codeplex.com/aspnet ,查看ASP.NET MVC源代码中的AuthorizeAttribute。
添加AttributeUsage之后,请确保将此属性添加到您的Attribute类
public override object TypeId { get { return this; } }
默认情况下, Attribute
被限制为只应用一次到一个字段/属性/等。 您可以从MSDN上Attribute
类的定义中看到这一点:
[AttributeUsageAttribute(..., AllowMultiple = false)] public abstract class Attribute : _Attribute
因此,正如其他人所指出的那样,所有的子类都是以相同的方式受到限制的,如果你需要同一个属性的多个实例,你需要明确地设置AllowMultiple
为true
:
[AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute
在允许多种用法的属性上, 还应该重写TypeId
属性,以确保PropertyDescriptor.Attributes
等PropertyDescriptor.Attributes
按预期工作。 最简单的方法是实现该属性以返回属性实例本身:
[AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute { public override object TypeId { get { return this; } } }
(发表这个答案不是因为别人错了,而是因为这是一个更全面/规范的答案。)