我尝试使用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);
附:对不起,我的英语不好;)
解决方法
如果您阅读
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);