让我们有以下内容:
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?坚持表达!?
谢谢!
答案 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。)