単一のパラメーターを使用して、コンパイルされた 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();
}
出力は、「キャッシュ挿入」、「キャッシュ ヒット」、「キャッシュ ヒット」、または「キャッシュ挿入」、「キャッシュ挿入」、「キャッシュ挿入」になります。