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

jok*_*efe 58 c# reflection async-await windows-runtime

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

TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
       .GetDeclaredMethod("ThePrivateMethod")
       .Invoke(theObject, null);
Run Code Online (Sandbox Code Playgroud)

但是,如果有问题的私有方法是async,代码将继续执行而不等待它完成.

如何await为此添加功能?

Jon*_*eet 101

那么你需要使用方法返回的值.你知道那种吗?例如,如果它始终是a Task,您可以使用:

await (Task) objType.GetTypeInfo()
                    .GetDeclaredMethod("ThePrivateMethod")
                    .Invoke(theObject, null);
Run Code Online (Sandbox Code Playgroud)

如果您不知道返回类型但知道它将是等待的,您可以使用动态类型:

await (dynamic) objType.GetTypeInfo()
                       .GetDeclaredMethod("ThePrivateMethod")
                       .Invoke(theObject, null);
Run Code Online (Sandbox Code Playgroud)

我会尽量避免在你的单元测试中通过反射调用私有方法.你可以通过公共(或内部)API间接测试吗?这通常是可取的.


Ste*_*ary 8

Invoke应该返回一个可转换为的对象Task.就是await这样.

如果您的私有方法返回void,那么您将需要一个SynchronizationContext杂乱的自定义.让你的方法返回Task/ 更好Task<T>.