65

WinRT アプリの単体テストを書いていますが、これを使用して非非同期のプライベート メソッドを呼び出すことができます。

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

ただし、問題のプライベート メソッドが の場合async、コードは終了を待たずに実行を続けます。

これに機能を追加するにはどうすればよいawaitですか?

4

2 に答える 2

113

メソッドによって返された値を使用する必要があります。タイプはわかりますか?たとえば、常に である場合は、次のTaskように使用できます。

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

戻り値の型がわからないが、それが待機可能であることがわかっている場合は、動的型付けを使用できます。

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

ただし、最初にユニットテストでリフレクションによってプライベートメソッドを呼び出す必要がないようにしますパブリック (または内部) API を介して間接的にテストできますか? それは一般的に好ましいです。

于 2013-02-05T16:01:09.187 に答える
9

Invokeに変換可能なオブジェクトを返す必要がありますTask。それだけawaitです。

プライベート メソッドが を返す場合、面倒なvoidカスタムが必要になります。メソッドが/SynchronizationContextを返すようにすることをお勧めします。TaskTask<T>

于 2013-02-05T16:00:49.807 に答える