在运行时创建委托类型

时间:2011-08-12 23:39:04

标签: c# .net

我尝试使用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 个答案:

答案 0 :(得分:12)

如果您阅读the documentation for Expression.GetDelegateType(),您会看到返回类型必须是 last 参数。

这意味着此代码应该有效:

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