c# - Delegate.CreateDelegate vs DynamicMethod versus Expression
.net reflection (2)
Preguntas sobre cómo hacer reflexionar y explorar delegados ...
Si necesito crear delegados Func<T, TResult>
a métodos en tipos cargados dinámicamente, podría utilizar (1) Delegate.CreateDelegate
(2) DynamicMethod
(3) Árboles de Expression
.
Digamos que el conjunto de tipos / métodos cargados dinámicamente se reflejan una vez al inicio de la aplicación a través de config y se usan durante toda la vida de la aplicación (el rendimiento de arranque no es un problema y tampoco lo es la memoria), los delegados se guardan en caché y se envían en un forma 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é?
A través del blog de Ayende obtuve este interesante enlace que muestra el tipo de cosas que puedes hacer con Dynamic Methods. Como ejemplo, es bastante comprensible:
Aceleración de diccionarios basados en Enum con EnumComparer genérico
Actualizar
Se debe tener en cuenta que en el mundo de WinRT, Reflection.Emit
no está disponible; se puede encontrar información here
Si en realidad son métodos existentes para los que tiene un MethodInfo
y tienen las firmas correctas, entonces diría que Delegate.CreateDelegate
es el camino correcto a seguir: hace exactamente lo que quiere, sin problemas. DynamicMethod
o árboles de expresión si tuviera que crear un delegado para ejecutar alguna lógica que no se haya capturado en un método.
Los árboles de expresión son (IMO, y no he usado DynamicMethod
enfadado) algo más fáciles de usar que DynamicMethod
, pero son más restringidos; básicamente, solo pueden representar una sola expresión (lo que podría llamar a otro método, por supuesto). DynamicMethod
le brinda mucha flexibilidad, pero necesita comprender IL razonablemente bien.
¿Eso ayuda?