Comment attendre une méthode privée asynchrone appelée en utilisant la reflection dans WinRT?

J’écris des tests unitaires pour une application WinRT, et je suis capable d’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 append des fonctionnalités en await à cela?

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

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

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

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

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

Invoke devrait renvoyer un object convertible en Task . await ça.

Si votre méthode privée retourne un void , vous aurez besoin d’un SynchronizationContext personnalisé, ce qui est compliqué. Il est préférable que vos méthodes renvoient Task / Task .