加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在运行时创建委托类型

发布时间:2020-12-15 08:26:37 所属栏目:百科 来源:网络整理
导读:我尝试使用Expression类创建委托类型,但是当我尝试从MethodInfo的实例创建委托时,我得到了一个ArgumentException.我使用的是.NET 4.0 这里代码: var method = /*...*/; ListType tArgs = new ListType { method.ReturnType }; var mparams = method.GetPara
我尝试使用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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读