2013-06-18 2 views
1

Привет Я использую отражение перебрать атрибутов свойств этой модели:Получение параметров и значения атрибута

[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; } 

foreach (var propertyInfo in type) 
     var attr = propertyInfo.CustomAttributes; 
     foreach (var customAttributeData in attr) 
     { 
      var name = customAttributeData.AttributeType.Name; 
     } 
} 

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

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

Примером может быть в состоянии получить: от требуемого атрибута ErrorMessage.Name и ErrorMessage.Value

ответ

0

Попробуйте искать одного типа атрибутов в то время:

foreach (var reqAttr in (RequiredAttribute[])propertyInfo.GetCustomAttributes(typeof(RequiredAttribute), false)) 
{ 
    // use reqAttr.ErrorMessage and so on, in here 
} 
+0

Это не является хорошим решением. Это * очень * неподъемный, и * очень * повторяющийся. – jason

+0

@Jason Возможно, это зависит от вашей задачи. Большую часть времени вы хотите проверить, присутствует ли 'RequiredAttribute' или нет, и если он есть, вы хотите проверить, для чего установлены его свойства. В таком случае я бы сделал, как указано выше. Конечно, если вы хотите найти *** все *** типы атрибутов и проверить, какие свойства у них есть, вам придется использовать гораздо больше отражения. Но типичное использование атрибутов выглядит так: проверьте только один конкретный атрибут и не заботитесь о других атрибутах (значение которых для вас не имеет значения или неизвестно). –

+0

Он не сказал специфически требуемый атрибут, и он показывает пару свойств со смесью атрибутов. – jason

1

Вам необходимо дополнительно использовать отражение, используя Type.GetProperties каждого атрибута, а затем с помощью PropertyInfo.GetValue дергать значения свойств, которые каждый атрибут публично раскрывает.

1

Вы можете использовать MemberInfo.Name и TypedValue.Value. Вот код:

foreach (var propertyInfo in typeof(YOUR CLASS).GetProperties()) 
{ 
    var attr = propertyInfo.GetCustomAttributesData(); 

    foreach (var customAttributeData in attr) 
    { 
     foreach (var item in customAttributeData.NamedArguments) 
     { 
      var name = item.MemberInfo.Name; 
      var value = item.TypedValue.Value; 
     } 
    } 
} 
Смежные вопросы