【发布时间】:2018-08-11 06:01:35
【问题描述】:
我正在编写一些调试/测试代码,我想在其中显示原始表达式并评估它,用于任意表达式。
对于(琐碎的)示例:
IList<string> myString = /* Some string collection expression */
ShowMe(myString.Select(s => s.ToLower()));
我在哪里实现 ShowMe 类似的东西:
public void ShowMe(/* Not sure what has to go here */)
{
/* Not sure what has to go here */
Console.WriteLine(expression.ToString();
IEnumerable result = expression.Evaluate(); // or something
foreach(item in result)
{
Console.WriteLine(/* etc. */)
}
}
结果将被写入控制台:
myString.Select(s => s.ToLower())
(第一项)
(下一项
(等等...)
换句话说,我的ShowMe 方法对表达式树而不是表达式的值进行操作,因此它既可以显示给出的表达式,也可以显示计算结果。
我不能简单地将ShowMe 声明为:
public void ShowMe(Expression expr)
...但如果我声明为
public void ShowMe(Expression<Func<Enumerable>> expr)
...它 sort-of 有效 - 我必须使用 lambda 表达式调用我的方法:
ShowMe(() => myString.Select(s => s.ToLower()))
...我不想这样做。
我有理由相信这是可以做到的...... FluentAssertions 做到了。例如:如果我执行下面这行测试代码:
(1 + 1).Should.Be(3)
我得到以下结果:
预期 (1 + 1) 为 3,但实际为 2。
FluentAssertion 已经评估了表达式 (1+1) 并捕获了表达式树,以便能够显示它评估的原始表达式。
我看不出这是如何做到的,但我想做类似的事情。我该怎么做?
【问题讨论】:
标签: c# expression-trees