2014-08-24 10 views
0

Ниже приведен код для перехватчика, который я хочу использовать для реализации cacheprovider. Мне нужно определить тип возвращаемого метода, который будет вызываться. Это довольно прямолинейно, когда вызываемый метод является синхронным. Однако большинство методов, с которыми я сталкиваюсь, являются async, они возвращают Задачу.Reflect the returnType метода асинхронизации

Как я могу использовать отражение, чтобы выяснить тип возврата методов async?

public void Intercept(IInvocation invocation) 
{ 
    try 
    { 
     if (invocation.Method.Name.StartsWith("Retrieve")) 
     { 
      var returnType = invocation.Method.ReturnType; 
      if (returnType.IsGenericType && 
       returnType.GetGenericTypeDefinition() == typeof (Task<>)) 
      { 
       var returnTypeOfTheTask = returnType.NeedSomeHelpHere(); 
      } 
     } 
     _circuitBreaker.Execute(invocation); 
    } 
    // ... 
} 
+1

См. [Это для получения параметров типа из экземпляра типового типа] (http://stackoverflow.com/questions/293905/reflection-getting-the-generic-parameters-from-a-system-type-instance). –

+3

Просто попробуйте 'var returnTypeOfTheTask = returnType.GenericTypeArguments [0];'. – haim770

ответ

4

Вы можете использовать либо

var returnTypeOfTheTask = returnType.GetGenericArguments()[0]; 

или

var returnTypeOfTheTask = returnType.GenericTypeArguments[0]; 

Какой вы будете использовать в основном зависит от платформ, которые вам нужно поддерживать (например, первый вариант, так как .NET существует 2.0, но не поддерживается в современном пользовательском интерфейсе, а второй вариант не существует в .NET 4.0). Я бы рекомендовал использовать второй метод, если бы оба работали для ваших нужд.

+0

спасибо, это работает как шарм, я пошел со вторым методом – UnreliableWitness