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

StackOverflow https://stackoverflow.com/questions/1540384

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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 почти одинаковы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top