简体   繁体   English

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

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

I have an expression that contains Func<,> delegate.我有一个包含 Func<,> 委托的表达式。 I'm trying to invoke it and to get the integer value as result我正在尝试调用它并获取整数值作为结果

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

When I Invoke expression, I get next error:当我调用表达式时,出现下一个错误:

Unhandled Exception: System.ArgumentException: Incorrect number of parameters supplied for lambda declaration at 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 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未处理的异常: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

How can I get the result of the Func<,> delegate invocation?如何获得 Func<,> 委托调用的结果?

You're wrapping a lambda in a lambda... this is not what you want.您将 lambda 包装在 lambda 中……这不是您想要的。 Try this:尝试这个:

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

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

        Console.WriteLine(result);
    }
}

If you want to use the "passthrough" TestMethod, you can do this:如果你想使用“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);
    }
}

Or if you want to rebuild the lambda from a non-generic expression:或者,如果您想从非泛型表达式重建 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