Определить, использует ли метод 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?

0 ответов

Другие вопросы по тегам