Как проверить, что аргумент метода украшен атрибутом?

Вероятно, это дубликат, но я не могу найти вопрос, который ищу, поэтому задаю его.

Как вы проверяете, что аргумент метода украшен атрибутом? Например, следующий метод действия MVC, использующий CustomizeValidatorAttribute FluentValidation:

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

Я уверен, что мне придется использовать отражение, надеюсь, со строго типизированными лямбдами. Но не знаю, с чего начать.


person danludwig    schedule 17.04.2012    source источник


Ответы (1)


Как только вы получите дескриптор метода с помощью GetMethodInfo вызова через Reflection, вы можете просто вызвать GetParameters() для этого метода, а затем для каждого параметра вы можете проверить вызов GetCustomAttributes() на наличие экземпляров типа X. Например:

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 на что-то более конкретное.

person Tejs    schedule 17.04.2012
comment
Спасибо за быстрый ответ. Я отредактировал вопрос, чтобы предоставить пример кода для получения MethodInfo. - person danludwig; 18.04.2012