0

让我们有以下几点:

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

谢谢!

4

1 回答 1

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)。这里我们通过重用第一个表达式的第一个参数作为“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");

我们在其中引入了一个新参数parExpression.Invoke其他两个表达式。

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

于 2013-08-30T09:42:38.493 回答