反映异步方法的返回类型

时间:2014-08-24 09:09:29

标签: c# reflection aop castle-dynamicproxy

以下是我希望用于实现缓存提供程序的拦截器的代码。我需要确定将被调用的方法的返回类型。当调用的方法是同步的时,这非常简单。但是,我遇到的大多数方法都是异步的,它们会返回一个任务。

如何使用反射来确定异步方法的返回类型?

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 个答案:

答案 0 :(得分:4)

您可以使用

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

var returnTypeOfTheTask = returnType.GenericTypeArguments[0];

您将使用哪一个主要取决于您需要支持的平台(例如,自.NET 2.0以来第一个选项存在但在Modern UI中不支持,而.NET 4.0中不存在第二个选项)。如果两种方法都能满足您的需求,我建议使用第二种方法。