如何等待在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
功能?
您需要使用该方法返回的值。你知道那种类型吗?例如,如果它总是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>
。