以下是我希望用于实现缓存提供程序的拦截器的代码。我需要确定将被调用的方法的返回类型。当调用的方法是同步的时,这非常简单。但是,我遇到的大多数方法都是异步的,它们会返回一个任务。
如何使用反射来确定异步方法的返回类型?
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);
}
// ...
}
答案 0 :(得分:4)
您可以使用
var returnTypeOfTheTask = returnType.GetGenericArguments()[0];
或
var returnTypeOfTheTask = returnType.GenericTypeArguments[0];
您将使用哪一个主要取决于您需要支持的平台(例如,自.NET 2.0以来第一个选项存在但在Modern UI中不支持,而.NET 4.0中不存在第二个选项)。如果两种方法都能满足您的需求,我建议使用第二种方法。