2

これはおそらく重複していますが、私が探している質問が見つからないので、私はそれを求めています。メソッドの引数が属性で飾られているかどうかをテストするには?

メソッド引数が属性で飾られていることをどのようにテストしますか?たとえば、使用して次のMVCのアクションメソッド、FluentValidationのCustomizeValidatorAttribute

[HttpPost] 
[OutputCache(VaryByParam = "*", Duration = 1800)] 
public virtual ActionResult ValidateSomeField(
    [CustomizeValidator(Properties = "SomeField")] MyViewModel model) 
{ 
    // code 
} 

私は強く型付けされたラムダとうまくいけば、リフレクションを使用する必要があります確信しています。しかし、どこから始めるべきかわからない。

答えて

3

あなたはリフレクション経由GetMethodInfo呼び出しとメソッドのハンドルを取得したら、あなたは、単にそのメソッドにGetParameters()を呼び出すことができ、その後、各パラメータについて、あなたは例えばタイプXのインスタンスに対してGetCustomAttributes()コールを調べることができます。

Expression<Func<MyController, ActionResult>> methodExpression = 
    m => m.ValidateSomeField(null); 
MethodCallExpression methodCall = (MethodCallExpression)methodExpression.Body; 
MethodInfo methodInfo = methodCall.Method; 

var doesTheMethodContainAttribute = methodInfo.GetParameters() 
     .Any(p => p.GetCustomAttributes(false) 
      .Any(a => a is CustomizeValidatorAttribute))); 

Assert.IsTrue(doesTheMethodContainAttribute); 

たとえば、このテストでは、パラメータのいずれかに属性が含まれているかどうかがわかります。特定のパラメータが必要な場合は、GetParametersコールをより具体的なものに変更する必要があります。

+0

すばやくお返事ありがとうございます。 MethodInfoを取得するためのサンプルコードを提供するために質問を編集しました。 – danludwig

関連する問題