Определить, использует ли метод C# yield return
Я пытаюсь написать простой механизм кеширования. По сути, всякий раз, когда вызывается метод, его возвращаемое значение должно сохраняться в кеше. Мой упрощенный 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?