在运行时创建委托类型

9

我尝试使用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. 抱歉我的英语不太好 ;)


这个链接是解决你问题的答案吗? - adrianbanks
1个回答

12

如果您阅读 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);

没有帮助。同样的异常:ArgumentException“链接最终方法时出错”。 - Alex Sabaka
请查看编辑,您可能有实例方法,这意味着您需要提供实例。 - svick
有没有办法动态创建一个带有 params 关键字的委托,用于最后一个参数类型? - mvorisek
@Mvorisek,不能使用Expression.GetDelegateType。我认为你需要使用反射发射来实现。 - svick
@svick 不过 params 只是语法糖,对吧?我认为对于 params object[],你只需要指定 object[] - Javid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接