2011-08-12 27 views
6

Intento crear un tipo de delegado utilizando una clase Expression, pero cuando intento crear un delegado a partir de la instancia de MethodInfo, tengo una ArgumentException. I utilizando .NET 4.0 Aquí código:Crear tipo de delegado en tiempo de ejecución

 var method = /*...*/; 
     List<Type> tArgs = new List<Type> { method.ReturnType }; 
     var mparams = method.GetParameters(); 
     mparams.ToList().ForEach(p => tArgs.Add(p.ParameterType)); 
     var delDecltype = Expression.GetDelegateType(tArgs.ToArray()); 
     return Delegate.CreateDelegate(delDecltype, method); 

P. S. Lo siento por mi inglés malo;)

+1

¿Cuál es el mensaje de la excepción? – svick

+0

¿Es [este] (http://stackoverflow.com/questions/2714989/delegate-createdelegate-and-generics-error-binding-to-target-method/2715050#2715050) la solución a su problema? – adrianbanks

Respuesta

11

Si lee the documentation for Expression.GetDelegateType(), verá que el tipo de devolución tiene que ser el último argumento.

Eso significa que el código debería funcionar:

var tArgs = new List<Type>(); 
foreach (var param in method.GetParameters()) 
    tArgs.Add(param.ParameterType); 
tArgs.Add(method.ReturnType); 
var delDecltype = Expression.GetDelegateType(tArgs.ToArray()); 
return Delegate.CreateDelegate(delDecltype, method); 

Este código funciona con los métodos estáticos sólo a través. Si desea crear un delegado a partir del método de instancia, debe proporcionar la instancia en la que desea llamar al método. Para hacer eso, cambie la última línea a:

return Delegate.CreateDelegate(delDecltype, instance, method); 
+0

No sirvió de nada. La misma excepción: ArgumentException "Error al vincular con el método final". –

+0

Ver edición, probablemente tenga método de instancia, lo que significa que debe proporcionar la instancia. – svick

Cuestiones relacionadas