Honouring of AttributeUsage on derived attribute types

allowmultiple, attributes, c#, inheritance

Solution

The problem is simply that the `AllowMultiple` check only compares attributes of the same actual type (i.e. the concrete type instantiated) - and is perhaps best used with `sealed` attributes for this reason.

It will, for example, enforce the following (as an illegal duplicate), inheriting this from `BaseAttribute`:

[DerivedAttributeB()]
[DerivedAttributeB()]
public string Name { get; set; }

In short, I don't think you can do what you want here... (enforce no more than one instance including subclasses of `BaseAttribute` per property).

A similar example of this problem would be:

[Description("abc")]
[I18NDescriptionAttribute("abc")]
public string Name { get; set; }

class I18NDescriptionAttribute : DescriptionAttribute {
    public I18NDescriptionAttribute(string resxKey) : base(resxKey) { } 
}

The intent above is to provide a `[Description]` from resx at runtime (fully supported by `ComponentModel` etc) - but it can't stop you also adding a `[Description]`.

Problem

Given the following, I would not expect the compiler to allow multiple attributes that are derived from the base attribute, given that is set to AllowMultiple=false. In fact it compiles without a problem - what am I missing here? ``` using System; [AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=true)] abstract class BaseAttribute : Attribute { } sealed class DerivedAttributeA : BaseAttribute { } sealed class DerivedAttributeB : BaseAttribute { } class Sample1 { [DerivedAttributeA()] [DerivedAttributeB()] public string PropertyA{ get; set; } // allowed, concrete classes differ [DerivedAttributeA()] [DerivedAttributeA()] public string PropertyB { get; set; } // not allowed, concrete classes the same, honours AllowMultiple=false on BaseAttribute } ```

Original source