Когда ожидать динамически вызываемый метод? - PullRequest
0 голосов
/ 24 июня 2018

Мой код делает это для вызова зарегистрированного метода при поступлении сетевых запросов. Это часть системы RPC.

Delegate method;
object result = method.DynamicInvoke(args);

Когда метод возвращает значение, все хорошо.Но когда он возвращает что-то ожидаемое, я не заинтересован в том, чтобы пытаться вернуть это ожидаемое что-то вызывающему абоненту сети.Они не будут использовать это, и это, вероятно, в любом случае не подлежит передаче.Вместо этого мне нужно дождаться его и затем вернуть фактический результат.

Я мог бы просто проверить, является ли тип возвращаемого значения метода чем-то вроде Task.Или Task<T>.Этого достаточно?Разве во вселенной не может быть других ожидаемых вещей?Как бы я проверил для типа Task?Я имею в виду, я не могу просто сделать что-то вроде этого:

method.Method.ReturnType is Task

Это не будет правдой.И нет также:

method.Method.ReturnType.IsAwaitable

Я признаю, что не смогу дождаться async void метода.Но следует ожидать чего-то еще, в конечном итоге ожидаемого.

1 Ответ

0 голосов
/ 25 июня 2018

То, что ожидаемо - это то, что знает компилятор.Вам нужно привязать его к типам, которые вы знаете, как обращаться.

Попробуйте что-то вроде этого:

object result = null;
if (method.Method.ReturnType.IsSubclassOf(typeof(Task)))
{
    if (method.Method.ReturnType.IsConstructedGenericType)
    {
        dynamic tmp = method.DynamicInvoke(args);
        result = tmp.GetAwaiter().GetResult();
    }
    else
    {
        (method.DynamicInvoke(args) as Task).GetAwaiter().GetResult();
    }
}
else
{
    result = method.DynamicInvoke(args);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...