2009-02-28 22 views
21

Preguntas sobre Making reflection fly and exploring delegates ...Delegate.CreateDelegate vs vs DynamicMethod expresión

Si necesito para crear delegados Func<T, TResult> a métodos en los tipos de carga dinámica que podría utilizar potencialmente (1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression árboles . Digamos que el conjunto de tipos/métodos cargados dinámicamente se reflejan una vez al inicio de la aplicación vía config enviado a en una manera fuertemente tipada. Estos delegados son rutas calientes a las que se accede simultáneamente.

¿Qué método de enlace dinámico preferiría y por qué?

Respuesta

19

Si son métodos que se tiene una MethodInfo para realmente existente, y tienen las firmas correctas, entonces yo diría que Delegate.CreateDelegate es el camino correcto a seguir - que hace exactamente lo que quiere, sin ningún problema. Yo usaría DynamicMethod o árboles de expresión si tuviera que construir un delegado para ejecutar alguna lógica que no estuviera ya capturada en un método.

árboles de expresión son (OMI, y no he utilizado DynamicMethod en la ira) un poco más fácil de usar que DynamicMethod, pero son más restringidos - básicamente sólo pueden representar una sola expresión (que podría llamar a otro método, de curso). DynamicMethod le da mucha flexibilidad, pero necesita entender IL razonablemente bien.

¿Eso ayuda?

+3

métodos dinámicos de rock cuando haz que trabajen. Sin embargo, lograr que funcionen a menudo implica muchas estrellas en IL, frustración y ataques con peverify. Pero producen resultados asombrosos. – JaredPar

+0

Confirma mis pensamientos también. Haciendo búsquedas de delegados en Google, parece que bastantes personas usan DynamicMethod para resolver este problema. Tengo una aplicación que hace un uso intensivo de Delegate.CreateDelegate en la forma que describí. – jsw

5

En el blog de Ayende obtuve este enlace interesante que muestra el tipo de cosas que puedes hacer con los métodos dinámicos. A modo de ejemplo, es bastante comprensible:
Accelerating Enum-Based Dictionaries with Generic EnumComparer

actualización

Hay que señalar que en el mundo de WinRT, Reflection.Emit no está disponible - alguna información se puede encontrar here

Cuestiones relacionadas