在运行时创建委托类型

在运行时创建委托类型

本文介绍了在运行时创建委托类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用Expression类创建委托类型,但是当我尝试从MethodInfo实例创建委托时,出现ArgumentException.我使用.NET 4.0此处代码:

I try create delegate type using an Expression class, but when I try create delegate from instance of MethodInfo I've got an ArgumentException. I using .NET 4.0Here code:

        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.对不起,我的英语不好;)

P.S. Sorry for my bad english;)

推荐答案

如果您阅读 Expression.GetDelegateType() 的文档,您将看到返回类型必须为 last 参数.

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

That means this code should work:

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

该代码仅适用于静态方法.如果要从实例方法创建委托,则需要提供要在其上调用该方法的实例.为此,将最后一行更改为:

This code works for static methods only though. If you want create a delegate from instance method, you need to provide the instance you want to call the method on. To do that, change the last line to:

return Delegate.CreateDelegate(delDecltype, instance, method);

这篇关于在运行时创建委托类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 06:27