2011-08-12 22 views
6

Próbuję utworzyć typ delegata za pomocą klasy Wyrażenie, ale gdy próbuję utworzyć delegata z instancji MethodInfo, mam wyjątek ArgumentException. I przy użyciu .NET 4.0 Oto kod:Utwórz typ delegowania w środowisku wykonawczym

 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); 

PS: Przepraszam za mój zły język angielski;)

+1

Co to jest wiadomość o wyjątku? – svick

+0

Czy [this] (http://stackoverflow.com/questions/2714989/delegate-createdelegate-and-generics-error-binding-to-target-method/2715050#2715050) jest rozwiązaniem Twojego problemu? – adrianbanks

Odpowiedz

11

Jeśli czytasz the documentation for Expression.GetDelegateType(), to widać, że zwracany typ musi być ostatni argumentem.

Oznacza to, że kod ten powinien działać:

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); 

Ten kod działa dla metod statycznych tylko choć. Jeśli chcesz utworzyć delegata z metody instancji, musisz podać instancję, do której chcesz wywołać metodę. Aby to zrobić, zmień ostatnią linię na:

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

To nie pomogło. Ten sam wyjątek: ArgumentException "Błąd podczas łączenia z ostatnią metodą." –

+0

Zobacz edytuj, prawdopodobnie masz metodę instancji, co oznacza, że ​​musisz podać instancję. – svick

Powiązane problemy