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

时间:2013-02-05 15:58:26

标签: c# reflection windows-runtime async-await

我正在为WinRT应用编写单元测试,我可以使用它来调用非异步私有方法:

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

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

如何向此添加await功能?

2 个答案:

答案 0 :(得分:94)

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

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

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

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

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

答案 1 :(得分:7)

Invoke应返回可转换为Task的对象。只需await那个。

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