2011-08-12 71 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