Черт, я ненавижу, когда доказываю, что ошибаюсь ... это работает, если вы определяете атрибут как защищенный вложенный тип базового класса:
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; }
}
(оригинальный ответ)
Вы не можете сделать это - по крайней мере, не во время компиляции.
Атрибуты могут быть ограничены (например, «класс», «структура», «метод», «поле» и т. Д.), Но ничего более гранулированного.
Конечно, поскольку атрибуты ничего не делают сами по себе (игнорируя PostSharp), они будут инертными для других типов (и инертными для ваших типов, если вы не добавите некоторый код для просмотра атрибутов во время выполнения).
Вы можете написать правило FxCop, но это кажется излишним.
Интересно, однако, является ли атрибут лучшим выбором:
Теперь все классы, которые должны применять мой пользовательский атрибут, являются производными от одного базового класса.
Если они должны применить ваш пользовательский атрибут, возможно, лучшим вариантом будет свойство / метод abstract
(или, может быть, просто virtual
)?
abstract class MyBase {
protected abstract string GetSomeMagicValue {get;}
}
class MyActualType : MyBase {
protected override string GetSomeMagicValue {get {return "Foo";}}
}