How to create duplicate allowed attributes

前端 未结 6 1789
旧巷少年郎
旧巷少年郎 2021-02-02 04:58

I\'m using a custom attribute inherited from an attribute class. I\'m using it like this:

[MyCustomAttribute(\"CONTROL\")]
[MyCustomAttribute(\"ALT\")]
[MyCustom         


        
相关标签:
6条回答
  • 2021-02-02 05:13

    Stick a AttributeUsage attribute onto your Attribute class (yep, that's mouthful) and set AllowMultiple to true:

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
    public sealed class MyCustomAttribute: Attribute
    
    0 讨论(0)
  • 2021-02-02 05:15

    AttributeUsageAttribute ;-p

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
    public class MyAttribute : Attribute
    {}
    

    Note, however, that if you are using ComponentModel (TypeDescriptor), it only supports one attribute instance (per attribute type) per member; raw reflection supports any number...

    0 讨论(0)
  • 2021-02-02 05:18

    By default, Attributes are limited to being applied only once to a single field/property/etc. You can see this from the definition of the Attribute class on MSDN:

    [AttributeUsageAttribute(..., AllowMultiple = false)]
    public abstract class Attribute : _Attribute
    

    Therefore, as others have noted, all subclasses are limited in the same way, and should you require multiple instances of the same attribute, you need to explicitly set AllowMultiple to true:

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

    On attributes that allow multiple usages, you should also override the TypeId property to ensure that properties such as PropertyDescriptor.Attributes work as expected. The easiest way to do this is to implement that property to return the attribute instance itself:

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

    (Posting this answer not because the others are wrong, but because this is a more comprehensive/canonical answer.)

    0 讨论(0)
  • 2021-02-02 05:25

    As an alternative, think about redesigning your attribute to allow for a sequence.

    [MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
    

    or

    [MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
    

    then parse the values to configure your attribute.

    For an example of this check out the AuthorizeAttribute in ASP.NET MVC source code at www.codeplex.com/aspnet.

    0 讨论(0)
  • 2021-02-02 05:31

    Anton's solution is correct, but there is another gotcha.

    In short, unless your custom attrbiute overrides TypeId, then accessing it through PropertyDescriptor.GetCustomAttributes() will only return a single instance of your attribute.

    0 讨论(0)
  • 2021-02-02 05:31

    After you add the AttributeUsage, make sure you add this property to your Attribute class

    public override object TypeId
    {
      get
      {
        return this;
      }
    }
    
    0 讨论(0)
提交回复
热议问题