【问题标题】:Create lambda action delegate dynamically动态创建 lambda 动作委托
【发布时间】:2017-01-02 04:41:43
【问题描述】:

当我有目标、MethodInfo 和要传入的参数时,我可以动态地创建一个带有像 () => Method(args) 这样的 lambda 表达式的 Action 委托吗?

假设我有一个采用 int 参数的方法,并希望分配一个 Action 委托以使用参数 1 调用它,就像 Action action = () => Method(1) 一样,但我想动态地执行它。你可以做一个委托并分配动作来动态调用它,或者分配它来调用方法,但是性能很糟糕。

public class DelegateData
{
    public object target;
    public MethodInfo method;
    public object[] args;
}

【问题讨论】:

标签: c# reflection lambda delegates


【解决方案1】:

想通了。使用表达式很容易,以这种方式创建委托当然非常慢(10.000 次迭代几乎需要 1 秒),但之后,委托的速度只有自然创建时的两倍。 lambda.Compile 是这里的罪魁祸首,但我看不出有什么办法。

var arguments = args.Select(a => Expression.Constant(a)).ToArray();
var lambda = Expression.Lambda(Expression.Call(Expression.Constant(target), method, arguments));
var result = (Action)lambda.Compile();

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多