2010-05-24 8 views
6

¿Hay alguna manera de aplicar un requisito de compilación para ciertos atributos en una implementación de clase o interfaz?¿Cómo puedo requerir un atributo en una definición de clase?

Por ejemplo, supongamos que mi aplicación utiliza una serie de clases estáticas que contienen const int valores de recursos. Me gustaría decorar la clase en un atributo Description para describir su contenido. En concepto, me gustaría aplicar este requisito de atributo a una interfaz, entonces cada clase estática lo implementaría con su Description requerido. Podría escribir una verificación en tiempo de ejecución o una unidad para verificar el cumplimiento. Pero realmente sería mejor una verificación en tiempo de compilación.

¿Existe tal cosa?

Respuesta

6

No, no hay nada como esto. Las pruebas unitarias son lo mejor que puedes hacer, hasta donde yo sé.

Si puede identificar las clases automáticamente (por nombre o algún otro atributo con el que está decorada la clase), puede escribir fácilmente una prueba unitaria para todas las clases de un ensamblaje.

+0

+1 I segunda unidad de pruebas para eso, fácil de escribir y aunque no lo hará haga que el compilador se queje, lo alertará con anticipación sobre la información faltante. –

1

Es posible en tiempo de ejecución, a través de Reflection.

Aquí es un método de prueba de unidad para usted:

... 
using System.Reflection; 
using System.Diagnostics; 
using System.Linq; 
... 

[TestMethod] 
public void CheckAttributes() 
{ 
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass)) 
     .GetTypes() 
     .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0); 

    Assert.AreEqual<int>(0, notAttributed.Count()); 
} 

Dónde MyAttribute es el tipo de su atributo y SomeClass es una clase en la asamblea que desea comprobar.
Es posible que también desee filtrar los tipos que desee verificar de esta manera. (Sólo si no se requiere cada clase en una asamblea de usar ese atributo, por supuesto.)


Si desea hacerlo en el código de producción, colocar un atributo Conditional("DEBUG") en él para asegurarse de que se solo se ejecuta en modo DEBUG.
(Porque la reflexión no es rápida, y realmente no tiene sentido ejecutar esto en modo de producción, ¿verdad?)

+0

Tiene sentido ejecutarlo en sus * pruebas unitarias * contra el código de producción. ¿Por qué lo haría condicional y pondría la prueba en su código de producción? –

+0

@Jon - Lo edité, ahora es una prueba unitaria. ¿Tiene sentido ahora? : P – Venemo

+0

Todos, excepto que está probando el conjunto de ejecución, que es un ensamblaje de prueba unitaria y por lo tanto poco probable que sea su código de producción :) (Yo usaría 'typeof (SomeWellKnownType) .Assembly'.) –

Cuestiones relacionadas