我正在写一些调试/测试代码,我想在其中显示原始表达式并对任意表达式进行求值。
对于(琐碎的)示例:
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)
..。在某种程度上,我必须使用lambda表达式来调用我的方法,如下所示:
ShowMe(() => myString.Select(s => s.ToLower()))
..。但我不想这么做。
我相当确定这是可以做到的..。FluentAssertions做到了。例如:如果我执行下面这行测试代码:
(1 + 1).Should.Be(3)
我得到了以下结果:
要求(1 + 1)为% 3,但找到% 2。
FluentAssertion既计算了表达式(1+1),又捕获了表达式树,以便能够显示它计算的原始表达式。
我不知道这是怎么做到的,但我想做类似的事情。我该怎么做呢?
https://stackoverflow.com/questions/51791968
复制相似问题