8

ASP.NETWebAPIプロジェクトがあります。[HttpGet]リフレクションを使用して、アクションメソッドを装飾するHttp動詞(以下の例)属性を取得するにはどうすればよいですか?

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

コントローラに上記のアクションメソッドがあると仮定します。Indexこれまでのところ、リフレクションを使用することで、アクションメソッドのMethodInfoオブジェクトを取得できました。これは、という変数に格納されています。methodInfo

次を使用してhttp動詞を取得しようとしましたが、機能しませんでした-nullを返します:

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

私が気づいたこと:

上記の私の例は、私が取り組んでいるASP.NETWebAPIプロジェクトからのものです。

[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();

あなたはとても近かった...

違いは、すべての「動詞」属性が「AcceptVerbsAttribute」属性を含む「ActionMethodSelectorAttribute」から継承されることです

于 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 に答える