【问题标题】:How to invoke Lambda expression using Expression class?如何使用 Expression 类调用 Lambda 表达式?
【发布时间】:2018-12-29 14:26:35
【问题描述】:

我有一个包含 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:为 lambda 声明提供的参数数量不正确 在 System.Linq.Expressions.Expression.ValidateLambdaArgs(类型 delegateType,Expression& 正文,ReadOnlyCollection1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable1 参数) 在 System.Linq.Expressions.Expression.Lambda[TDelegate](表达式主体,布尔 tailCall,IEnumerable`1 参数) 在 System.Linq.Expressions.Expression.Lambda[TDelegate](表达式主体,ParameterExpression[] 参数) 在 E:\programming\portfolio\TestConsoleApp\TestConsoleApp\Program.cs:line 22 中的 TestConsoleApp.Program.Main(String[] args) 处

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

【问题讨论】:

    标签: c# delegates expression


    【解决方案1】:

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

    【讨论】:

    • 出于同样的原因,我想使用 Expression 实例来存储 Expression>。我看到你的决定会奏效。你不介意我是否会请你帮助我调用我的代表 - Expression expr: Expression expr = TestMethod(i => i + 1);
    • @EvgeniyMiroshnichenko 我添加了一些代码,希望是您正在寻找的。​​span>
    • 这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多