Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待在WinRT中使用反射调用异步私有方法?_C#_Reflection_Windows Runtime_Async Await - Fatal编程技术网

C# 如何等待在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,

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

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
将不起作用,WinRT
iasyncation
@Jon Skeet:谢谢!这就成功了。返回的是一个
任务
对象,所以我所需要做的就是强制转换它并添加
等待
。我还发现,当您将单元测试方法设置为
异步时,也需要将其返回类型设置为
任务
,否则单元测试框架将无法执行它。@Jeff:如果您能提供更多详细信息,比如您遇到的编译器错误,那会有所帮助。创建一个新问题而不是对它进行评论性讨论可能是值得的。@Jeff:这听起来像是你试图使用
await
,而不是使用
async
方法(或lambda)-这与你试图等待的内容无关。@Shimmy:不,你不需要这样做。这只是一个实现细节。您应该知道它是否将异步执行,但方法可以返回
任务
,并异步执行,而无需通过async/await实现。