2008-10-30 14 views
12

Sé que es posible (en teoría) crear un nuevo tipo en tiempo de ejecución, pero ¿es posible modificar un cuerpo de método de un tipo existente en tiempo de ejecución? Mi plan (si puedo hacer que esto funcione) es etiquetar los métodos con un atributo personalizado, y luego buscar en tiempo de ejecución los métodos con el atributo e insertar parte de mi propio código en el cuerpo del método.¿Es posible modificar un cuerpo de método en tiempo de ejecución en .NET?

¿Alguna sugerencia?

Supongo que si no puedo conseguir ese enfoque para el trabajo, siempre podría usar un método virtual en una clase base (con los atributos), combinado con una fábrica estática para escupir un tipo dinámico derivado con mi ejecución método de tiempo-generado en la clase de niño. Sin embargo, esto no sería tan limpio de usar.

Respuesta

9

PostSharp que es un aftercompiler, hace algo similar a lo que usted describe, usando atributos para marcar puntos de inyección en el código , la única diferencia es que lo hace en tiempo de compilación.

Pero también puede hacerlo en el tiempo de ejecución no cambiando el cuerpo del método, sino usando clases derivadas de ContextBoundObject que es una clase .Net que le permite interceptar todas las llamadas realizadas en su contra. Aquí hay un MSDN Magazine article que describe cómo hacer un AOP usando ContextBoundObject. (Marque los aspectos en .Net parte del artículo)

y como tercera opción que puede utilizar código de generación dinámica (Reflection.Emit o CodeDom) en combinación con atributos y métodos virtuales para generar dinámicamente las clases derivadas donde puede insertar su código, pero esta es la forma más dolorosa de hacerlo.

Editar:

Hay una cuarta opción de utilizar .Net unmanaged profiling API para interceptar método JIT-ción y reemplazar cuerpos de los métodos por delante de JIT-ción. JustMock (Telerik) utiliza esta técnica con éxito para simular métodos estáticos, no virtuales e incluso clases selladas.

0

¿Está planeando hacer esto para tipos arbitrarios? Supongo que no, dado que vas a decorar los métodos con un atributo.

Dado que, creo que el mejor enfoque sería definir métodos abstractos en una súper clase para sus tipos. Un método en la superclase puede albergar el código del método de la placa de la caldera y delegar en las implementaciones concretas a través de los métodos abstractos para el comportamiento del método de ese tipo.

En términos generales, a menos que entre en crear archivos de código y compilar ensamblados dinámicos en tiempo de ejecución, no se puede hacer lo que está buscando hacer. Es probable que haya muchos más principios y patrones OO prácticos que pueda utilizar para lograr casi el mismo resultado.

3

No puede modificar un método existente en tiempo de ejecución, pero puede crear uno con código DOM sobre la marcha y ejecutarlo. O bien, podría combinar cadenas de código, compilarlo en la memoria y ejecutarlo.

He hecho esto último yo mismo (una aplicación que había permitido código C# personalizado que se compiló y ejecutó en memoria, tiempo de ejecución).

Cuestiones relacionadas