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

前端 未结 2 1944
执笔经年
执笔经年 2020-12-04 18:53

I\'m writing unit tests for a WinRT app, and I am able to invoke non-async private methods using this:

TheObjectClass theObject = new TheObjectClass();
Type          


        
相关标签:
2条回答
  • 2020-12-04 19:26

    Invoke should return an object convertible to Task. Just await that.

    If your private method returns void, then you'll need a custom SynchronizationContext, which is messy. It's better to have your methods return Task/Task<T>.

    0 讨论(0)
  • 2020-12-04 19:32

    Well you need to use the value returned by the method. Do you know the type? For example, if it's always a Task, you could use:

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

    If you don't know the return type but know it will be awaitable, you could use dynamic typing:

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

    I would try to avoid having to call a private method by reflection in your unit tests in the first place though. Can you test it indirectly via the public (or internal) API? That's generally preferable.

    0 讨论(0)
提交回复
热议问题