如何创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 

因此,正如其他人所指出的那样,所有的子类都是以相同的方式受到限制的,如果你需要同一个属性的多个实例,你需要明确地设置AllowMultipletrue

 [AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute 

在允许多种用法的属性上, 还应该重写TypeId属性,以确保PropertyDescriptor.AttributesPropertyDescriptor.Attributes按预期工作。 最简单的方法是实现该属性以返回属性实例本身:

 [AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute { public override object TypeId { get { return this; } } } 

(发表这个答案不是因为别人错了,而是因为这是一个更全面/规范的答案。)