Я хотел бы провести аудит как часть модульного теста, который использует отражение для проверки некоторых предположений, код базового псевдо для этого будет выглядеть следующим образом:
Для каждогокласс в данной сборке, найдите классы контроллера (ASP.NET MVC2).
Для каждого действия в этом классе найдите любое действие, которое украшено данным атрибутом (давайте вызовем this TargetAttribute
)
Для каждого из этих методов, украшенных интересующим атрибутом, убедитесь, что хотя бы один из параметров метода действия реализует данный интерфейс (назовем это ITarget
).
Как мне провести такую проверку?(ответы в C # или VB.NET приветствуются)
Редактировать:
Я публикую здесь окончательный код (переведенный в VB.NET), который выполняет эту проверку:
Dim ass As Assembly = Assembly.GetAssembly(GetType(Web.WebConfiguratorMarker))
Dim methodsToCheck = ass.GetTypes().
Where(Function(t) t.IsSubclassOf(GetType(Controller))).
SelectMany(Function(t) t.GetMethods()).
Where(Function(m) m.GetCustomAttributes(GetType(AutoValidateJsonModelAttribute), False).Length > 0).
Where(Function(m) m.ReturnType Is GetType(ActionResult)).ToArray()
For Each method In methodsToCheck
Dim implementsIValidatable As Boolean = False
For Each param In method.GetParameters()
If GetType(IValidatable).IsAssignableFrom(param.ParameterType) Then
implementsIValidatable = True
Exit For
End If
Next
Assert.True(implementsIValidatable, String.Format("Controller of type [{0}] has an action [{1}] that is decorated with <AutoValidateJsonModel()> but does not have a IValidatable instance as a param", method.DeclaringType, method.Name))
Next