繁体   English   中英

如何使用 Expression 类调用 Lambda 表达式?

[英]How to invoke Lambda expression using Expression class?

我有一个包含 Func<,> 委托的表达式。 我正在尝试调用它并获取整数值作为结果

class Program
{
    static Expression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = Expression.Lambda<Func<int, int>> (expr).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

当我调用表达式时,出现下一个错误:

未处理的异常:System.ArgumentException:System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection 1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable为 lambda 声明提供的参数数量不正确1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 1 parameters) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters) at System.Linq.Expressions.Expression。 Lambda[TDelegate](Expression body, ParameterExpression[] parameters) at TestConsoleApp.Program.Main(String[] args) in E:\\programming\\portfolio\\TestConsoleApp\\TestConsoleApp\\Program.cs:line 22

如何获得 Func<,> 委托调用的结果?

您将 lambda 包装在 lambda 中……这不是您想要的。 尝试这个:

class Program
{
    static void Main(string[] args)
    {
        Expression<Func<int, int>> expr = i => i + 1;

        var result = expr.Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

如果你想使用“passthrough”TestMethod,你可以这样做:

class Program
{
    static Expression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = ((Expression<Func<int, int>>)expr).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

或者,如果您想从非泛型表达式重建 lambda:

class Program
{
    static LambdaExpression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = Expression.Lambda<Func<int, int>>(expr.Body, expr.Parameters).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM