6

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

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

コントローラに上記の処理方法があるとします。これまでは、リフレクションを使用して、私はという名前のアクションメソッドのIndexアクションメソッドのMethodInfoオブジェクトを取得することができました。

次のようにhttp動詞を取得しようとしましたが、ナル:私は気づい

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
var methodInfo = MethodBase.GetCurrentMethod(); 
var attribute = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().FirstOrDefault(); 

ているようです...

の違いは、すべての「動詞の属性は「ActionMethodSelectorAttribute」私から継承することは非常に近いです'AcceptVerbsAttribute'属性を除きます。

+0

ありがとう@Elieただし、ソリューションはASP.NET MVCアプリケーションでのみ動作しますが、ASP.NET Web APIアプリケーションでは動作しません。WEB APIプロジェクトでは、http動詞 - HttpGetはMVCプロジェクトのHttpGetとは異なります。 – cda01

2

私はこれを必要としましたが、Web API属性の実際の要件に対処する回答がなかったので、私は答えを投稿しました。

Web APIを属性は次のとおりです。

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

Mvcの対応するものとは異なり、それらは基本属性タイプから継承しませんが、継承しますSystem.Attributeから直接呼び出します。したがって、個々のタイプごとに個別にチェックする必要があります。

私はそうのようなMETHODINFOクラスを拡張し、小さな拡張メソッド作った:あなたは上記の拡張メソッドはあなたを取得する呼び出し、反射して、コントローラのアクションメソッドの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(); 
    } 

をこのメソッドに現在あるすべてのアクションメソッドの属性:

var webApiMethodAttributes = methodInfo.GetWebApiMethodAttributes(); 
+0

'methodInfo.GetCustomAttributes()。ここで(attr => attrはIActionHttpMethodProviderです)' – Trevor

関連する問題