2012-01-19 6 views
7

Recientemente leí sobre atributos y reflexión y pensé que sería un buen método para incluir metadatos en mi programa. Tengo esta clase abstracta y quería que todas las clases heredaran de ella para declarar con la clase algún atributo, ya que quería que se crearan componentes personalizados (esas clases derivadas) para mi programa y quería leer los metadatos de estas clases en tiempo de ejecución. Sin embargo, todas las clases derivadas deben declarar explícitamente el atributo en el que almaceno los metadatos. Entonces, ¿cómo forzar una declaración de atributo en las clases derivadas? Gracias.Declaración de atributo de fuerza en clases derivadas

Respuesta

4

Defina su clase de atributo para que tenga un atributo AttributeUsageAttribute donde la propiedad Inherited es .

o no hacer, ya que es el valor por defecto ...

objetivos derivados (es decir, las clases si el atributo está en una clase, métodos si es en un método, etc.) entonces heredar el atributo sin declaración explícita.

+0

¡increíble! Gracias. – irisjay

2

Si por "fuerza", quiere decir "compilar el cumplimiento del tiempo": No puede.

1

Como dijo Daniel, no puede aplicar atributos en tiempo de compilación.

Pero si quiere leer los datos en tiempo de ejecución, ¿para qué preocuparse por los atributos y la reflexión? Puede crear un método abstracto en su clase abstracta:

abstract class Base 
{ 
    public abstract string Metadata(); 
} 

class Derived1 : Base 
{ 
    public override string Metadata() 
    { 
     return "Metadata for Derived1"; 
    } 
} 

class Derived2 : Base // won't compile, since Metadata has not been provided 
{ 
} 

El comportamiento es ligeramente diferente, por supuesto. Con esta opción, necesita una referencia a una instancia de la clase derivada en lugar de solo la información del tipo en sí. Por otro lado, evita la reflexión.

+0

Sin embargo, el problema es que quiero buscar los metadatos simplemente desde el ensamblado, sin ninguna instancia de clase. ¿Cómo puedo hacer eso? – irisjay

+0

@testgo: me temo que mi solución sugerida no es útil para usted en ese momento. – Heinzi

1

Como dice Daniel, no se puede forzar en tiempo de compilación. Puede agregar los atributos al padre abstracto y recogerlos.

Otra opción es agregar un método para verificar la existencia del atributo en la clase principal y lanzar una excepción si no está presente. Llama eso desde métodos adecuados.

Cuestiones relacionadas