2013-06-18 3 views
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 
     } 
     } 
    } 

Если вы ooked на код немного и читать комментарии, которые вы можете увидеть, что в данный момент я могу получить доступ из каждого действия, его параметры.

В нашем примере возвращаемый параметр будет иметь тип LoginModelDTO.

Отныне я хотел бы именовать все свойства этого объекта для каждого свойства, чтобы получить его CustomAttributes.

Как я могу это достичь?

+0

В вашем примере кода, параметры *** не имеют атрибутов * ** - методы и свойства; это намеренно? –

+0

Параметры метода или свойства объекта? Я не совсем уверен, что вы после. –

+0

терминология мудрая, похоже, это путаница в вопросе - вы получаете «пользовательские действия», которые являются * методами *, но вы вызываете параметры переменных ',' parameterInfo' и т. д. - вы объединяете методы и параметры? –

ответ

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))) { 
    // ... 
} 

Обратите внимание, однако, что в вашем примере параметры не имеют атрибутов.

+0

Есть также перегрузки тех методов, которые принимают общие параметры вместо параметра типа (.NET 4.5+). Например: http://msdn.microsoft.com/en-us/library/hh194330.aspx –

1

См. Это SO question.

В основном они используют 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(); 

} 
Смежные вопросы