下面是我希望用于实现cacheprovider的拦截器的代码。我需要确定将要调用的方法的返回类型。当调用的方法是同步的时,这是非常直接的。然而,我遇到的大多数方法都是异步的,它们返回一个任务。
我如何使用反射来找出异步方法的返回类型?
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);
}
// ...
}
您可以使用
var returnTypeOfTheTask = returnType.GetGenericArguments()[0];
或
var returnTypeOfTheTask = returnType.GenericTypeArguments[0];
你将使用哪一个主要取决于你需要支持的平台(例如,第一个选项从。net 2.0开始就存在,但在Modern UI中不支持,而第二个选项在。net 4.0中不存在)。如果这两种方法都能满足你的需要,我建议你使用第二种方法。