Darn, I hate it when I prove myself wrong... it works if you define the attribute as a protected nested type of the base-class:
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; }
}
(original answer)
You cannot do this - at least, not at compile time.
Attributes can be restricted (for exmaple) to "class", "struct", "method", "field", etc - but nothing more granular.
Of course, since attributes do nothing by themselves (ignoring PostSharp), they will be inert on other types (and inert on your types unless you add some code to look at the attributes at runtime).
You could write an FxCop rule, but that seems overkill.
I wonder, however, whether an attribute is the best choice:
Now all the classes that must apply my custom attribute are derived from a single base class.
If they must apply your custom attribute, maybe an abstract
(or maybe just virtual
) property / method would be a better choice?
abstract class MyBase {
protected abstract string GetSomeMagicValue {get;}
}
class MyActualType : MyBase {
protected override string GetSomeMagicValue {get {return "Foo";}}
}