web-dev-qa-db-fra.com

Comment attendre une méthode privée asynchrone invoquée en utilisant la réflexion dans WinRT?

J'écris des tests unitaires pour une application WinRT et je peux invoquer des méthodes privées non asynchrones en utilisant ceci:

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

Cependant, si la méthode privée en question est async, le code continuera son exécution sans attendre sa fin.

Comment puis-je ajouter une fonctionnalité await à cela?

58
jokeefe

Eh bien, vous devez utiliser la valeur renvoyée par la méthode. Connaissez-vous le type? Par exemple, si c'est toujours un Task, vous pouvez utiliser:

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

Si vous ne connaissez pas le type de retour mais savez qu'il sera attendu, vous pouvez utiliser le typage dynamique:

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

Je voudrais essayer pour éviter d'avoir à appeler une méthode privée par réflexion dans vos tests unitaires en premier lieu cependant. Pouvez-vous le tester indirectement via l'API publique (ou interne)? C'est généralement préférable.

100
Jon Skeet

Invoke devrait renvoyer un objet convertible en Task. Juste await ça.

Si votre méthode privée renvoie void, vous aurez besoin d'un SynchronizationContext personnalisé, ce qui est compliqué. Il vaut mieux que vos méthodes retournent Task/Task<T>.

8
Stephen Cleary