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

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

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

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

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

Ответы на вопрос(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 позвонить в нечто более конкретное.

 danludwig18 апр. 2012 г., 04:45
Спасибо за быстрый ответ. Я отредактировал вопрос, чтобы предоставить пример кода для получения MethodInfo.

Ваш ответ на вопрос