首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时创建委托类型

在运行时创建委托类型
EN

Stack Overflow用户
提问于 2011-08-13 07:39:04
回答 1查看 6.5K关注 0票数 8

我尝试使用Expression类创建委托类型,但是当我尝试从MethodInfo的实例创建委托时,我得到了一个ArgumentException。我在这里使用.NET 4.0代码:

代码语言:javascript
复制
        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);

附言:为我糟糕的英语感到抱歉;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-13 07:47:37

如果你阅读the documentation for Expression.GetDelegateType(),你会发现返回类型必须是最后一个参数。

这意味着下面的代码应该可以工作:

代码语言:javascript
复制
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);

不过,这段代码只适用于静态方法。如果要从实例方法创建委托,则需要提供要调用该方法的实例。为此,请将最后一行更改为:

代码语言:javascript
复制
return Delegate.CreateDelegate(delDecltype, instance, method);
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7047440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档