2016-07-20 17 views
0

は私が[HttpGet]属性と[HttpPost]属性をキャプチャしていないのはなぜですか?

foreach(var controller in controllers) 
{ 
    // ... 
    var actions = controller.GetMethods() 
          .Where(method => method.ReturnType == typeof(IHttpActionResult)); 
    foreach(var action in actions) 
    { 
     // ... 
     var httpMethodAttribute = action.GetCustomAttributes(typeof(System.Web.Mvc.ActionMethodSelectorAttribute), true).FirstOrDefault() as System.Web.Mvc.ActionMethodSelectorAttribute; 
     // ... 
    } 
} 

のようなコードの部分を持っているが、私はactionCustomAttributeそのisSystem.Web.Mvc.ActionMethodSelectorAttributeを持っていることを確認できる場合でも、何らかの理由httpMethodAttributeは常にnullです。私が間違っていることは何か考えていますか?

+0

の後にあるものであれば、あなたが受け入れる気になりそれ?そうでない場合は、私に知らせてください。 – Amy

答えて

2

GetCustomAttributes(..., true)は、指定した正確なタイプの属性のみを取得し、呼び出すメンバーの継承階層を検索すると、GetCustomAttributesがオンになります。あなたが探している属性タイプを継承する属性は取得されません。

HttpGetAttributeを取得するには、GetCustomAttributes(typeof(HttpGetAttribute), true)に電話する必要があります。 HttpPostAttributeと同じことです。例えば

あなたは親コントローラからメソッドをオーバーライドして、親のFooが属性を持っていたアクションメソッドFooを持っている場合は、2番目のパラメータは、両親にカスタム属性を返すかどうかをGetCustomAttributesを言うだろう。手遅れ

0

年、しかし、あなたはHttpMethodAttributeを取得したい場合:

var httpMethodAttr = (HttpMethodAttribute)action.GetCustomAttributes() 
         .SingleOrDefault(a => typeof(HttpMethodAttribute).IsAssignableFrom(a.GetType()); 

やタイプが私の答えは満足のいくものであった場合は、

var httpMethodType = (from a in action.GetCustomAttributes() 
         let t = a.GetType() 
         where typeof(HttpMethodAttribute).IsAssignableFrom(t) 
         select t).SingleOrDefault(); 
if (httpMethodType = null || httpMethodType == typeof(HttpGetAttribute)) 
関連する問題