1

嗨,我只是在学习反射,我正在尝试读取用属性 T4ValidateAttribute 装饰的控制器中的操作参数。

举个例子:

 public class LoginModelDTO
{      
    [Required(ErrorMessage = "Username is required")]
    [MaxLength(50, ErrorMessage = "Username should not have more then 50 chars")]
    [MinLength(25 , ErrorMessage = "Username should have at least 25 chars")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Password is required")]
    [StringLength(25)]
    public string Password { get; set; }

    public bool RememberMe { get; set; }
}

[T4ValidateAttribute]
public bool LogIn(LoginModelDTO modelDTO)
{
    return m_loginService.Login(modelDTO);
}

我的控制器在一个名为 prokect.WebApi 的项目中,而我的 DTO 在一个名为 project.DomainServices.Contracts 的项目中。我不会添加 ControllerInfo,因为如果你们认为需要它,我会添加它。

 //This code get all the controllers that inherit from the BaseApiController     
 List<Type> controllers = ControllersInfo.GetControllers<BaseApiController>("project.WebApi");

 foreach (var controller in controllers)
 {
    //This retrives a Dictionary that has the key the method name and the valie an array of ParameterInfo[]
     var actions = ControllersInfo.GetAllCustomActionsInController(controller, new T4ValidateAttribute());
     foreach (var parameterInfose in actions)
     {
         var parameters = parameterInfose.Value;
         foreach (var parameterInfo in parameters)
         {
            //This is where I do not knwo what to do   
         }
       }
    }

如果您稍微查看一下代码并阅读注释,您会发现此时我可以从每个操作中访问它的参数。

在我们的示例中,返回参数将是 LoginModelDTO 类型。

从这里开始,我想对每个属性的这个对象的所有属性进行迭代,以获得它的 CustomAttributes。

我怎样才能做到这一点?

4

2 回答 2

3

在最简单的级别:

var attribs = Attribute.GetCustomAttributes(parameterInfo);

如果您感兴趣的所有属性都有一个共同的基本类型,您可以将其限制为:

var attribs = Attribute.GetCustomAttributes(parameterInfo,
                    typeof(CommonBaseAttribute));

然后,您只需循环attribs并选择您关心的内容。如果您认为最多有一种特定类型:

SomeAttributeType attrib = (SomeAttributeType)Attribute.GetCustomAttribute(
       parameterInfo, typeof(SomeAttributeType));
if(attrib != null) {
     // ...
}

最后,如果您只想知道属性是否已声明,这比GetCustomAttribute[s]

if(Attribute.IsDefined(parameterInfo, typeof(SomeAttributeType))) {
     // ...
}

但是请注意,在您的示例中,参数没有 attributes

于 2013-06-18T11:51:53.687 回答
1

请参阅这个 SO问题

基本上他们ReflectedControllerDescriptor用来获取ActionDescriptor实例列表(我认为你在做类似的ControllersInfo.GetAllCustomActionsInController方法):

var actionDescriptors = new ReflectedControllerDescriptor(GetType())
  .GetCanonicalActions();
foreach(var action in actionDescriptors)
{
   object[] attributes = action.GetCustomAttributes(false);

   // if you want to get your custom attribute only
   var t4Attributes = action.GetCustomAttributes(false)
    .Where(a => a is T4ValidateAttribute).ToList();

}
于 2013-06-18T11:56:05.287 回答