Соблюдение AttributeUsage для производных типов атрибутов - PullRequest
5 голосов
/ 12 октября 2009

Учитывая следующее, я не ожидал бы, что компилятор разрешит несколько атрибутов, которые получены из базового атрибута, учитывая, что для него установлено значение AllowMultiple = false. На самом деле он компилируется без проблем - что мне здесь не хватает?

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
    }

1 Ответ

6 голосов
/ 12 октября 2009

Проблема заключается в том, что проверка AllowMultiple сравнивает только атрибуты одного и того же фактического типа (то есть конкретизированный конкретный тип) - и, возможно, лучше всего использовать с атрибутами sealed по этой причине.

Это, например, обеспечит принудительное выполнение следующего (как недопустимый дубликат), унаследовав это от BaseAttribute:

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

Короче говоря, я не думаю, что вы можете делать то, что вы хотите здесь ... (принудительно применять не более одного экземпляра , включая подклассы из BaseAttribute для свойства).

Подобный пример этой проблемы:

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

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

Цель выше - предоставить [Description] от resx во время выполнения (полностью поддерживается ComponentModel и т. Д.) - но не может остановить вас также добавив [Description].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...