Использование пользовательских атрибутов - PullRequest
1 голос
/ 09 октября 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 октября 2009

Что касается вопроса / ответа, на который вы ссылаетесь, я предполагаю, что будет некоторый код, который выполняется либо на уровне данных, либо в самом классе, который выполняет проверку. Этот код будет использовать 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 ) );
       }
 }
1 голос
/ 09 октября 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 практически одинаковы.

1 голос
/ 09 октября 2009

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

...