【问题标题】:Expression.Block method gives different errors in c#Expression.Block 方法在 c# 中给出不同的错误
【发布时间】:2013-08-30 09:31:33
【问题描述】:

让我们有以下几点:

Func<string, int> counterOfChar = (myString) => {
         Console.WriteLine("Here is my parameter "+myString); 
         return myString.Count();
};

我想把所有涉及到的表达式都带到这里,通过这样定义它们:

Expression<Action<string>> first = (param) => Console.WriteLine("Here is my parameter "+param);
Expression<Func<string, int>> second = (param) => param.Count();

然后以Expression.Block(first, second);为例。

我现在挣扎了一周,我不想告诉你直到现在收到的错误有多么多样化。 有人可以为委托编写相应的 Block 和 lambda 表达式,但不深入 ex: Method.Call 吗?只要坚持表达!?

谢谢!

【问题讨论】:

    标签: expression block


    【解决方案1】:
    Expression<Action<string>> first = (param) => Console.WriteLine("Here is my parameter " + param);
    Expression<Func<string, int>> second = (param) => param.Length; // .Count() is useless here!
    
    Expression<Func<string, int>> third = 
        Expression.Lambda<Func<string, int>>(
             Expression.Block(first.Body, 
                              Expression.Invoke(second, first.Parameters[0])), 
             first.Parameters[0]);
    
    var f = third.Compile();
    var r1 = f("Hello");
    

    “合并”两个表达式总是有点复杂,因为两个表达式的两个param 是“不同的”。它们不一样param(就像一个是param1,另一个是param2)。这里我们通过重用第一个表达式的第一个参数作为“new”表达式的参数和Expression.Invoke另一个表达式来解决它。

    没有作弊,我们可以有

    var par = Expression.Parameter(typeof(string));
    
    Expression<Func<string, int>> third = 
        Expression.Lambda<Func<string, int>>(
            Expression.Block(
                Expression.Invoke(first, par), 
                Expression.Invoke(second, par)), 
            par);
    
    var f = third.Compile();
    var r1 = f("Hello");
    

    我们引入了一个新参数par 和我们Expression.Invoke 其他两个表达式。

    请注意,实体框架不支持Expression.Invoke。在这种情况下,您可以使用参数重写器(类似于this。)

    【讨论】:

    • 这里说避免 cmets 为:谢谢...等。
    • 我已标记为答案,但我无法投票,我需要更多声誉。答案正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多