Подтвердить что ты не робот

Как ждать частного метода async, вызванного использованием отражения в WinRT?

Я пишу модульные тесты для приложения WinRT, и я могу использовать неасинхронные частные методы, используя это:

TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
       .GetDeclaredMethod("ThePrivateMethod")
       .Invoke(theObject, null);

Однако, если данный частный метод async, код продолжит выполнение, не дожидаясь его завершения.

Как добавить функциональность await к этому?

4b9b3361

Ответ 1

Ну, вам нужно использовать значение, возвращаемое методом. Вы знаете тип? Например, если он всегда Task, вы можете использовать:

await (Task) objType.GetTypeInfo()
                    .GetDeclaredMethod("ThePrivateMethod")
                    .Invoke(theObject, null);

Если вы не знаете тип возврата, но знаете, что он будет доступен, вы можете использовать динамический ввод:

await (dynamic) objType.GetTypeInfo()
                       .GetDeclaredMethod("ThePrivateMethod")
                       .Invoke(theObject, null);

Я бы постарался, чтобы избежать вызова частного метода путем отражения в ваших модульных тестах, в первую очередь. Можете ли вы проверить его косвенно через публичный (или внутренний) API? Это обычно предпочтительнее.

Ответ 2

Invoke должен вернуть объект, конвертируемый в Task. Просто await, что.

Если ваш частный метод возвращает void, тогда вам понадобится пользовательский SynchronizationContext, который является грязным. Лучше вернуть свои методы Task/Task<T>.