Использование настраиваемых атрибутов

Взглянув на следующий вопрос, Использование настраиваемых атрибутов .NET в реальном мире как бы вы реализовали решение, предложенное @Esteban?

Думаю, я немного не понимаю, когда и где будет выполняться код. Не могли бы вы предоставить хороший образец кода.

Я задавал этот вопрос раньше, но неправильно сформулировал его, я так думаю ...


person griegs    schedule 08.10.2009    source источник


Ответы (3)


Что касается вопроса / ответа, на который вы ссылаетесь, я предполагаю, что будет некоторый код, который работает либо на уровне данных, либо в самом классе, который выполняет проверку. Этот код будет использовать Reflection для проверяемого объекта, чтобы найти свойства с различными атрибутами и запустить конкретную логику проверки, связанную с этим атрибутом для этого свойства.

Это может выглядеть примерно так:

 public void Validate( object obj )
 {
       foreach (var property in obj.GetType().GetProperties())
       {
            var attribute = property.GetCustomAttributes(typeof(ValidationAttribute), false);
            var validator = ValidationFactory.GetValidator( attribute );
            validator.Validate( property.GetValue( obj, null ) );
       }
 }
person tvanfosson    schedule 08.10.2009
comment
Хорошо, в этом есть большой смысл. Я думал, что упускал важный элемент, но оказалось, что нет. Черт! :) Спасибо @tvanfosson - person griegs; 09.10.2009

При отправке (сохранении) формы html (форма выигрыша) вы получаете обратно измененный класс клиента. Для каждого свойства вы проверяете, связан ли с ним настраиваемый атрибут (унаследованный от ValidationAttribute или реализующий интерфейс IValiador или что-то подобное). Для каждого такого свойства вы вызываете метод проверки атрибута (создаете соответствующий класс проверки и вызываете метод проверки) для значения свойства.

person Alex Reitbort    schedule 08.10.2009

Вы бы использовали отражение:

public class MyClass
{
     [Description("I'm an attribute!")]
     public int MyField;

     public Attribute GetAttribute(string fieldName)
     {
          FieldInfo field = typeof(MyClass).GetField("MyField");
          Attribute[] attributes = (Attribute[])field.GetCustomAttributes(typeof(Attribute), false);

          DescriptionAttribute desc = (DescriptionAttribute)attributes[0];
          return desc;
     }
}

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

person Community    schedule 08.10.2009