8

我有一个 ASP.NET Web API 项目。使用反射,如何获得[HttpGet]装饰我的操作方法的 Http 动词(在下面的示例中)属性?

[HttpGet]
public ActionResult Index(int id) { ... }

假设我的控制器中有上述操作方法。到目前为止,通过使用反射,我已经能够获得Index我存​​储在一个名为的变量中的操作方法的 MethodInfo 对象methodInfo

我尝试使用以下方法获取 http 动词,但它不起作用 - 返回 null:

var httpVerb = methodInfo.GetCustomAttributes(typeof (AcceptVerbsAttribute), false).Cast<AcceptVerbsAttribute>().SingleOrDefault();

我注意到的一件事:

我上面的示例来自我正在处理的 ASP.NET Web API 项目。

似乎[HttpGet]是一个 System.Web.Http.HttpGetAttribute

但在常规 ASP.NET MVC 项目中,[HttpGet]它是 System.Web.Mvc.HttpGetAttribute

4

2 回答 2

6
var methodInfo = MethodBase.GetCurrentMethod();
var attribute = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().FirstOrDefault();

你很亲近...

不同之处在于所有“动词”属性都继承自“ ActionMethodSelectorAttribute ”,包括“ AcceptVerbsAttribute ”属性。

于 2012-05-24T02:07:02.297 回答
4

我只是需要这个,由于没有解决 Web Api 属性的实际要求的答案,我已经发布了我的答案。

Web Api 属性如下:

  • System.Web.Http.HttpGetAttribute
  • System.Web.Http.HttpPutAttribute
  • System.Web.Http.HttpPostAttribute
  • System.Web.Http.HttpDeleteAttribute

与它们的 Mvc 对应物不同,它们不从基本属性类型继承,而是直接从 System.Attribute 继承。因此,您需要单独手动检查每种特定类型。

我做了一个小的扩展方法,像这样扩展 MethodInfo 类:

    public static IEnumerable<Attribute> GetWebApiMethodAttributes(this MethodInfo methodInfo)
    {
        return methodInfo.GetCustomAttributes().Where(attr =>
            attr.GetType() == typeof(HttpGetAttribute)
            || attr.GetType() == typeof(HttpPutAttribute)
            || attr.GetType() == typeof(HttpPostAttribute)
            || attr.GetType() == typeof(HttpDeleteAttribute)
            ).AsEnumerable();
    }

通过反射获得控制器操作方法的 MethodInfo 对象后,调用上述扩展方法将为您获取当前在该方法上的所有操作方法属性:

    var webApiMethodAttributes = methodInfo.GetWebApiMethodAttributes();
于 2013-07-13T18:08:36.403 回答