Ответ 1
Darn, я ненавижу, когда я доказываю, что ошибаюсь... он работает, если вы определяете атрибут как защищенный вложенный тип базового класса:
abstract class MyBase {
[AttributeUsage(AttributeTargets.Property)]
protected sealed class SpecialAttribute : Attribute {}
}
class ShouldBeValid : MyBase {
[Special]
public int Foo { get; set; }
}
class ShouldBeInvalid {
[Special] // type or namespace not found
[MyBase.Special] // inaccessible due to protection level
public int Bar{ get; set; }
}
(исходный ответ)
Вы не можете сделать это - по крайней мере, не во время компиляции.
Атрибуты могут быть ограничены (для exmaple) до "class", "struct", "method", "field" и т.д., но не более гранулированы.
Конечно, поскольку атрибуты ничего не делают сами по себе (игнорируя PostSharp), они будут инертными по другим типам (и инертным по вашим типам, если вы не добавите некоторый код для просмотра атрибутов во время выполнения).
Вы можете написать правило FxCop, но это кажется излишним.
Интересно, однако, является ли атрибут лучшим выбором:
Теперь все классы, которые должны применять мой пользовательский атрибут, производятся из одного базового класса.
Если они должны применить свой собственный атрибут, возможно, лучший способ выбрать abstract
(или, может быть, просто virtual
)?
abstract class MyBase {
protected abstract string GetSomeMagicValue {get;}
}
class MyActualType : MyBase {
protected override string GetSomeMagicValue {get {return "Foo";}}
}