如何等待在WinRT中使用反射调用的异步私有方法

本文关键字:调用 反射 异步 有方法 何等待 等待 WinRT | 更新日期: 2023-09-27 17:57:52

我正在为WinRT应用程序编写单元测试,并且我能够使用以下方法调用非异步私有方法:

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

但是,如果所讨论的私有方法是async,则代码将继续执行,而不等待它完成。

如何向其中添加await功能?

如何等待在WinRT中使用反射调用的异步私有方法

您需要使用该方法返回的值。你知道那种类型吗?例如,如果它总是Task,则可以使用:

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

如果你不知道返回类型,但知道它是不可用的,你可以使用动态键入:

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

我会尝试,以避免在单元测试中首先通过反射来调用私有方法。您是否可以通过公共(或内部)API间接测试它?这通常更可取。

Invoke应该返回一个可转换为Task的对象。只是await

如果您的私有方法返回void,那么您将需要一个自定义的SynchronizationContext,这很混乱。最好让您的方法返回Task/Task<T>