una propiedades programar programacion metodos lenguaje declaración cómo crear como comandos codigos clases clase avanzada atributos c# reflection attributes reflection.emit

propiedades - programacion avanzada c#



¿Cómo agrego atributos a un método en tiempo de ejecución? (4)

Debes adentrarte en el mundo de DynamicMethod . Sin embargo, como necesita entonces saber MSIL, realmente sugiero que piense mucho sobre su arquitectura.

Estamos usando Microsoft.Practices.CompositeUI.EventBroker para gestionar la suscripción y publicación de eventos en nuestra aplicación. La forma en que funciona es que agrega un atributo a su evento, especificando un nombre de tema, como este:

[EventPublication("example", PublicationScope.Global)] public event EventHandler Example;

luego agrega otro atributo a su controlador, con el mismo nombre de tema, como este:

[EventSubscription("example", ThreadOption.Publisher)] public void OnExample(object sender, EventArgs e) { ... }

Luego pasas tus objetos a un EventInspector que combina todo.

Necesitamos depurar esto, así que estamos tratando de crear una clase de depuración que se suscriba a todos los eventos. Puedo obtener una lista de todos los nombres de tema ... pero solo en tiempo de ejecución. Entonces, debo poder agregar atributos a un método en tiempo de ejecución, antes de pasar nuestro objeto de depuración al EventInspector.

¿Cómo agrego atributos a un método en tiempo de ejecución?


EventInspector usa EventTopics (que se almacenan en el WorkItem) para hacer todo el trabajo pesado. Cada objeto EventTopic tiene acceso a un TraceSource llamado

Microsoft.Practices.CompositeUI.EventBroker.EventTopic

Que puedes habilitar en tu archivo app.config como este:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.diagnostics> <switches> <add name="Microsoft.Practices.CompositeUI.EventBroker.EventTopic" value="All" /> </switches> </system.diagnostics> </configuration>

Esto debería hacer que muchos mensajes útiles sean enrutados a su ventana de depuración en Visual Studio. Si desea ir más allá de la ventana de depuración de VS, tiene muchas opciones. Recomiendo ver el siguiente artículo:

Code Instrumentation con TraceSource My Persoanl Vade Mecum


Lo que intentas lograr es bastante complicado, así que trataré de ofrecerte algo para que comiences. Esto es lo que creo que necesitaría combinar para lograr algo:

  1. Defina una clase abstracta AbstractEventDebugger , con un método de Search que busca todos los miembros del event y los registra con EventInspector. Además, defina un método IdentifyEvent que le permita identificar el evento que lo ha llamado (esto depende de usted, qué parámetros tendrá, etc.).
  2. Defina un dynamic type utilizando TypeBuilder (como se describe aquí ), que hereda de su clase. Esta clase sería la clase de tu objeto debugger .
  3. Adjunte los Controladores a su clase utilizando Reflection.Emit.MethodBuilder (consulte aquí ), que llamará al método IdentifyEvent de la clase principal y,
  4. Reflection.Emit los atributos en los controladores utilizando la clase CustomAttributeBuilder (ver aquí ).
  5. Cree una instancia de su clase dynamic y envíela al EventInspector.
  6. Encenderlo :)

Aquí hay una muestra sobre cómo crear un método que llame algo (En realidad es el clásico "Hola mundo").

Tendrá que hacer muchos ajustes para que se haga bien, pero aprenderá mucho sobre la reflexión.

¡Buena suerte!


Los atributos son una característica en tiempo de compilación (a menos que se trate de ComponentModel, pero sospecho que está usando el reflejo). Como tal, no puede agregar atributos en tiempo de ejecución. Sería una pregunta similar a "¿cómo puedo agregar un método adicional a un tipo en tiempo de ejecución?". En C # / .NET regular (pre-DLR), no puedes.