2011-08-12 5 views
6

Expressionクラスを使用してデリゲート型を作成しようとしましたが、MethodInfoのインスタンスからデリゲートを作成しようとするとArgumentExceptionが発生します。実行時にデリゲート型を作成する

 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.:私はここにコードを.NET 4.0 を使用して私の悪い英語のため申し訳ありません;)

+1

例外のメッセージは何ですか? – svick

+0

あなたの問題に対する解決策は[this](http://stackoverflow.com/questions/2714989/delegate-createdelegate-and-generics-error-binding-to-target-method/2715050#2715050)ですか? – adrianbanks

答えて

11

あなたがthe documentation for Expression.GetDelegateType()を読めば、あなたは戻り値の型が最後の引数にする必要がありことがわかります。

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

このコードはのみしかし、静的メソッドのために動作します。このコードは動作するはずです意味

。デリゲートをインスタンスから作成する場合は、メソッドを呼び出すインスタンスを指定する必要があります。これを行うには、最後の行を次のように変更します。

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

それは助けになりませんでした。同じ例外:ArgumentException "最終メソッドとのリンク時にエラーが発生しました。" –

+0

編集を参照してください。おそらくインスタンスメソッドがあります。つまり、インスタンスを提供する必要があります。 – svick

関連する問題