C# 如何等待在WinRT中使用反射调用异步私有方法?
我正在为WinRT应用程序编写单元测试,我能够使用以下方法调用非异步私有方法:C# 如何等待在WinRT中使用反射调用异步私有方法?,c#,reflection,windows-runtime,async-await,C#,Reflection,Windows Runtime,Async Await,我正在为WinRT应用程序编写单元测试,我能够使用以下方法调用非异步私有方法: TheObjectClass theObject = new TheObjectClass(); Type objType = typeof(TheObjectClass); objType.GetTypeInfo() .GetDeclaredMethod("ThePrivateMethod") .Invoke(theObject, null); 但是,如果所讨论的私有方法是async,
TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
但是,如果所讨论的私有方法是async
,则代码将继续执行,而不等待它完成
如何将
wait
功能添加到此中?Invoke
应返回可转换为任务的对象。只需等待
如果您的私有方法返回
void
,那么您将需要一个自定义的SynchronizationContext
,这很混乱。最好让您的方法返回Task
/Task
那么您需要使用该方法返回的值。你知道它的类型吗?例如,如果它始终是一个任务
,则可以使用:
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
如果您不知道返回类型,但知道它将等待,则可以使用动态键入:
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
不过,首先我会尽量避免在单元测试中通过反射调用私有方法。您可以通过公共(或内部)API间接测试它吗?这通常更可取。因为这是一个WinRT应用程序,我觉得不允许反射/调用私有成员。我现在在谷歌上找不到这方面的官方文档,最接近的是:编辑:这些都是单元测试,所以这可能不是问题。:)@Chris Sinclair事实上,我上面的代码对于私有方法非常有效。我的问题是关于异步的。这个问题也适用于通过反射调用的公共方法。但是,如果
GetAwaiter()
是一个扩展方法,则强制转换到dynamic
将不起作用,WinRTiasyncation
@Jon Skeet:谢谢!这就成功了。返回的是一个任务
对象,所以我所需要做的就是强制转换它并添加等待
。我还发现,当您将单元测试方法设置为异步时,也需要将其返回类型设置为任务
,否则单元测试框架将无法执行它。@Jeff:如果您能提供更多详细信息,比如您遇到的编译器错误,那会有所帮助。创建一个新问题而不是对它进行评论性讨论可能是值得的。@Jeff:这听起来像是你试图使用await
,而不是使用async
方法(或lambda)-这与你试图等待的内容无关。@Shimmy:不,你不需要这样做。这只是一个实现细节。您应该知道它是否将异步执行,但方法可以返回任务
,并异步执行,而无需通过async/await实现。