2011-02-10 15 views
15

Duplicar posibles:
Specify required base class for .NET attribute targetsCómo hacer atributo .NET sólo es válido en ciertos tipos

quiero especificar que mi atributo personalizado sólo será válida en ciertos tipos (basado en la interfaz o clase base).
De esta manera:

attributes

¿Cómo puedo hacer eso?

+0

Corrija si estoy equivocado: quiere tener un 'FooAttribute' que, cuando se aplica a algo que no sea un tipo derivado de' Fooable', fallará la compilación (o al menos producirá una advertencia). –

+0

@ Adam Robinson: sí, ahora veo que la pregunta es un duplicado, pero la respuesta dada allí no es correcta para mí -> Debería haber especificado que el atributo y la clase base restrictiva (o interfaz) están en diferentes ensamblajes, por lo implementar el atributo como una clase anidada no es práctico. – TDaver

+0

La respuesta dada allí es el único medio para lograr lo que estás hablando. Aparte de eso, es imposible. –

Respuesta

12

Parece que desea crear un Attribute que solo se puede aplicar a ciertos tipos en de la misma manera que AttributeUsage solo se puede aplicar a los tipos derivados de Attribute. La introducción de este tipo de restricción personalizada simplemente no es posible. El error particular que está viendo no se debe a una restricción personalizada, sino que está simplemente conectado al compilador.

+0

De hecho; abrir la clase 'Attribute' en Reflector muestra que no existe tal lógica en la clase. –

+0

Eso es exactamente lo que hice antes de preguntar aquí :) – TDaver

2

No creo que pueda, solo puede especificar en qué tipo de elemento de idioma es válido el atributo. AttributeUsageAttribute es un caso especial, porque el compilador es consciente de ello y no le permite aplicarlo en algo que no es un atributo

+1

Odio cuando usan trucos CLR. Quiero hacer eso. – TDaver

+0

@TDaver: No es el CLR el que hace trampa, sino el compilador. Entonces, si escribe su propio compilador, puede agregar esta funcionalidad :) Tal vez con la característica "compilador como servicio" de C# 5, esto se vuelve fácil. –

Cuestiones relacionadas