Можете ли вы использовать отражение для получения LocalVariables в методе asyn c? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь написать метод, который будет программно генерировать документацию о том, где определенные типы используются в приложении. Я пытаюсь использовать отражение, чтобы определить, какие методы создают экземпляры этих типов. Это отлично работает для обычных методов, например:

class Program
{
    static void Main(string[] args)
    {
        var program = typeof(Program);
        
        var variablesTestMethod = program.GetMethod("VariablesTest").GetMethodBody().LocalVariables;

        Console.ReadLine();
    }

    public void VariablesTest()
    {
        var firstVariable = "First Variable";
        var secondVariable = 10;
    }
}

В этом случае variablesTestMethodLocalVariables - это список, содержащий 2 элемента, System.String и System.Int32, чего я и ожидал. Однако, если метод помечен как asyn c, это не сработает.

class Program
{
    static void Main(string[] args)
    {
        var program = typeof(Program);

        var asyncVariablesTestMethod = program.GetMethod("AsyncVariablesTest").GetMethodBody().LocalVariables;

        Console.ReadLine();
    }

    public async Task AsyncVariablesTest()
    {
        var firstVariable = "First Variable";
        var secondVariable = 10;
    }
}

В этом случае вместо списка, содержащего две переменные, есть только одна переменная, и тип указан как LocalVariablesTest.Program+<AsyncVariablesTest>d__2, что мне не нужно.

Есть ли способ определить типы, на которые ссылается асинхронный метод, с помощью свойства LocalVariables в теле метода? Или есть другой метод или библиотека, которые я мог бы использовать, чтобы получить то, что мне нужно?

1 Ответ

0 голосов
/ 09 июля 2020

Благодаря совету canton7 об использовании sharplab.io , я смог увидеть, что для моего метода asyn c компилятор генерирует класс, реализующий IAsyncStateMachine, с методом MoveNext() . Этот сгенерированный класс имел поля для переменных, которые я объявил в моем методе, к которым я мог получить доступ следующим образом:

    static void Main(string[] args)
    {
        var program = typeof(Program).GetTypeInfo();

        var variable = program.GetMethod("AsyncVariablesTest").GetMethodBody().LocalVariables.Single();
        var methodVariables = program.GetTypeInfo().GetDeclaredNestedType(variable.LocalType.Name).DeclaredFields;

        Console.ReadLine();
    }

Это позволило мне получить то, что мне нужно для моего конкретного c варианта использования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...