2011-08-12 101 views
6

我嘗試使用Expression類創建委託類型,但是當我嘗試從MethodInfo的實例創建委託時,我有一個ArgumentException。我使用.NET 4.0 這裏代碼:在運行時創建委託類型

 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.對不起,我的英語不好;)

+1

異常的消息是什麼? – svick

+0

Is this [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