2011-07-25 15 views
12

Creé esta clase de anotación
Este ejemplo podría no tener sentido porque siempre arrojará una excepción pero todavía lo estoy usando porque solo estoy tratando de explicar cuál es mi pregunta. Mi anotación nunca se llama por alguna razón alguna solución?C# - ¿Utiliza anotaciones personalizadas?

public class AuthenticationRequired : System.Attribute 
{ 
    public AuthenticationRequired() 
    { 
     // My break point never gets hit why? 
     throw new Exception("Throw this to see if annotation works or not"); 
    } 
} 

[AuthenticationRequired] 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // My break point get here 
} 
+4

Aquí tienes cómo acceder y leer su anotación personalizada: http://msdn.microsoft.com/en-us/library /z919e8tw.aspx#Y109 –

Respuesta

22

Mi anotación nunca se llama, por alguna razón alguna solución?

Esto es una especie de malentendido de atributos. Los atributos existen efectivamente para agregar metadatos a ciertas partes de su código (clases, propiedades, campos, métodos, parámetros, etc.). El compilador toma la información en el atributo y la hornea en la IL que escupe cuando termina de comer su fuente. código.

Los atributos por sí mismos no hacen nada a menos que alguien los consuma. Es decir, alguien en algún momento tiene que descubrir su atributo y luego tomar medidas al respecto. Se sientan en la IL de su asamblea, pero no hacen nada a menos que alguien los encuentre y actúe en consecuencia. Solo cuando lo hagan se instanciará una instancia del atributo. La forma típica de hacer esto es usar la reflexión.

para obtener los atributos en tiempo de ejecución, lo que tiene que decir algo como

var attributes = typeof(Foo) 
        .GetMethod("Window_Loaded") 
        .GetCustomAttributes(typeof(AuthenticationRequired), true) 
        .Cast<AuthenticationRequired>(); 

foreach(var attribute in attributes) { 
    Console.WriteLine(attribute.ToString()); 
} 
+0

Disculpe si esto no se compila, no tengo un compilador a mano. – jason

+0

Gracias por la respuesta, ¿es posible hacer que cuando un método tenga un atributo específico se llame a un bloque específico de código? ¿Sería eso una mala práctica? Digamos que quiero que cada método con el atributo "Log" registre la hora. Estoy tratando de usar este método para reutilizar el código – aryaxt

+2

@aryaxt: Sí, es posible hacer eso. Pero necesita algo para construir eso para usted (puede hacerlo usted mismo, pero hay herramientas disponibles que lo harán por usted). Lo que está buscando es algo que construirá dinámicamente un proxy para usted. Estas preocupaciones a menudo se llaman preocupaciones transversales, y este tipo de programación se llama programación orientada a aspectos. Si observa las capacidades de interceptación en Castle Windsor, por ejemplo, verá cómo se puede hacer: http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason

Cuestiones relacionadas