2

这可能是重复的,但我找不到我正在寻找的问题,所以我问它。

您如何测试方法参数是否用属性修饰?例如,以下 MVC 操作方法,使用 FluentValidation 的CustomizeValidatorAttribute

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

我确定我必须使用反射,希望使用强类型的 lambda。但不确定从哪里开始。

4

1 回答 1

3

一旦你GetMethodInfo通过反射获得了方法的句柄,你可以简单地调用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调用更改为更具体的参数。

于 2012-04-17T19:22:07.200 回答