簡単なキャッシングメカニズムを書こうとしています。基本的に、メソッドが呼び出されるたびに、その戻り値をキャッシュに保存する必要があります。AOPを使用すると、簡略化した CacheAspect は次のようになります。
using Castle.DynamicProxy;
public class CacheAspect : IInterceptor
{
private object cache;
public void Intercept(IInvocation invocation)
{
if (cache is null)
{
invocation.Proceed();
cache = invocation.ReturnValue;
return;
}
invocation.ReturnValue = cache;
}
}
ただし、アスペクトがyield returnを使用するメソッドをインターセプトすると、コンパイラが生成したステートマシンのみをキャッシュし、具体化された結果はキャッシュしません。そのため、その場合はフェイルファストにしてほしいと思います。
したがって、yield return を使用するかどうかに関係なく、メソッドの戻り値から差し引きたいと思います。これまでのところ、仕事を成し遂げるこの解決策しか見つけられませんでした。
private static bool IsReturnTypeCompilerGenerated(IInvocation invocation) =>
invocation
.ReturnValue
.GetType()
.GetCustomAttribute(typeof(CompilerGeneratedAttribute), inherit: true)
is object;
これに関する私の問題は、コンパイラによって生成された他の型があり、どのような状況で発生するのかがわからないことです。除外すべきではないメソッドをキャッシュメカニズムから除外することは可能ですか? または別の言い方をすれば、yield return を使用するメソッドをより具体的にターゲットにする方法はありますか?