Expression.Block方法在c#中给出了不同的错误

时间:2013-08-30 09:31:33

标签: expression block

让我们有以下内容:

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?坚持表达!?

谢谢!

1 个答案:

答案 0 :(得分:2)

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)。在这里,我们通过重用第一个表达式的第一个参数作为“新”表达式的参数并将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。)