Usando expresiones linq, ¿cómo puedo crear y devolver un delegado?

En C # estoy intentando usar expresiones linq para generar llamadas a ciertos métodos. Uno de los parámetros del método es un delegado. Tengo MethodInfo para el método que quiero pasar como delegado, simplemente no estoy seguro de la sintaxis de linq para crear delegados.

Esto es un poco artificial, pero espero que esto muestre lo que estoy tratando de hacer:

[C#]
delegate void Example();

object instance = ...;
MethodInfo methodToCall = ...;
MethodInfo methodToReference = instance.GetType().GetMethod("Foo");
var lambda = Expression.Call(
    methodToCall,
    Expression.New(
      typeof(Example).GetConstructor(new [] { typeof(object), IntPtr }),
      Expression.Constant(instance),
      Expression.Constant(/* IntPtr from MethodInfo?? */)));

lambda.Compile()();

El problema es que el constructor de un delegado solicita un IntPtr, ¡no estoy seguro de cómo obtenerlo! ¿Existe una forma más directa de crear un objeto delegado que intentar usar el método de expresión New ()?

preguntado el 08 de enero de 11 a las 17:01

Tal vez Expression.Lambda() en lugar de Constant? -

Acabo de hacer una pequeña función que acepta Expression > y luego pasó en C # lambda. Puede mirar el árbol de expresión que generó C # y resulta que C # genera una llamada a Delegate.CreateDelegate (...) y la lanza. ¡Demasiado fácil! -

1 Respuestas

Example e = (Example)Delegate.CreateDelegate(typeof(Example), instance, methodToReference);

Respondido el 08 de enero de 11 a las 20:01

Si, eso es correcto. Sin embargo, solo tuve que usar expresiones linq para generar este código. - Justin M. Chase

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.