如何在等待使用WinRT中调用反射异步私有方法?(How to await an async pri

2019-07-19 07:51发布

我在写单元测试的WinRT的应用程序,我能够调用非异步使用这个私有方法:

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

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

如何添加await功能呢?

Answer 1:

那么你需要使用该方法的返回值。 你知道是什么类型? 举例来说,如果它总是一个Task ,你可以使用:

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

如果你不知道的返回类型,但知道这将是awaitable,你可以使用动态类型:

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

我会尽量避免在首位,虽然叫反射私有方法的单元测试。 你可以通过公共(或内部)API间接地测试它? 这是一般可取。



Answer 2:

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

如果您的专用方法返回void ,那么你就需要自定义SynchronizationContext ,这是凌乱。 最好是有你的方法返回Task / Task<T>



文章来源: How to await an async private method invoked using reflection in WinRT?