Darn, odio cuando demuestre mi mal ... funciona si se define el atributo como un protegida tipo anidado de la clase base:
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; }
}
(respuesta original)
No puede hacer esto, al menos, no en tiempo de compilación.
Los atributos se pueden restringir (por ejemplo) a "clase", "estructura", "método", "campo", etc., pero nada más granular.
Por supuesto, dado que los atributos no hacen nada por sí mismos (ignorando PostSharp), serán inertes en otros tipos (e inertes en sus tipos a menos que agregue algún código para ver los atributos en tiempo de ejecución).
Puede escribir una regla FxCop, pero eso parece exagerado.
Me pregunto, sin embargo, si un atributo es la mejor opción:
Ahora todas las clases que se deben aplicar mi atributo personalizado se derivan de una sola clase base.
Si deben aplicar su atributo personalizado, tal vez una abstract
(o tal vez sólo virtual
) Propiedad/método sería una mejor opción?
abstract class MyBase {
protected abstract string GetSomeMagicValue {get;}
}
class MyActualType : MyBase {
protected override string GetSomeMagicValue {get {return "Foo";}}
}
¿Desea forzarlo (para que se complete automáticamente) o restringirlo (para que no pueda aplicarse a otros tipos)? –
Quiero restringirlo para que no se pueda aplicar a tipos distintos a los no derivados de mi clase base. –
Edit: ¡maldición, creo que me contradiqué al encontrar una manera de hacerlo! Una nueva para mí ... –