簡體   English   中英

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

[英]How to await an async private method invoked using reflection in WinRT?

我正在為WinRT應用程序編寫單元測試,並且我能夠使用以下方法調用非異步私有方法:

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

但是,如果有問題的私有方法是async ,代碼將繼續執行而無需等待它完成。

如何為此添加await功能?

那么你需要使用方法返回的值。 你知道那種嗎? 例如,如果它始終是一個Task ,您可以使用:

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

如果您不知道返回類型但知道它將是等待的,您可以使用動態類型:

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

我會盡量避免在你的單元測試中通過反射調用私有方法。 你可以通過公共(或內部)API間接測試嗎? 這通常是可取的。

Invoke應該返回一個可轉換為Task的對象。 await那個。

如果你的私有方法返回void ,那么你需要一個自定義的SynchronizationContext ,這很麻煩。 讓方法返回Task / Task<T>更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM