我想使用单个参数同时获得编译后的 Func(of boolean) 和 Expression(of Func(of boolean))。我不打算修改表达式树。完全采用表达式树的唯一原因是我可以打印出正在执行的代码。
void Assert(Expression<Func<bool>> assertionExpression) {
if (!assertionExpression.Compile()())
{
throw new AssertFailedException(assertionExpression.ToString());
}
}
有什么合理的方法可以做到这一点吗?
作为一个推论,在简单的编译器生成表达式树的情况下,相同的实例是否总是作为参数传递?
static Dictionary<Expression<Func<bool>>, Func<bool>> cache;
static void Assert(Expression<Func<bool>> assertionExpression) {
Func<bool> method = null;
if (!cache.TryGetValue(assertionExpression, out method)) {
cache.Add(assertionExpression, method = assertionExpression.Compile());
Console.WriteLine("cache insert");
}
else {
Console.WriteLine("cache hit");
}
if (!method())
{
throw new AssertFailedException(assertionExpression.ToString());
}
}
static void someCodeThatExecutesRegularly() {
Assert(()=>true);
}
public static void Main(string[] args, int argc)
{
someCodeThatExecutesRegularly();
someCodeThatExecutesRegularly();
someCodeThatExecutesRegularly();
}
输出将是“缓存插入”、“缓存命中”、“缓存命中”还是“缓存插入”、“缓存插入”、“缓存插入”。