Использование пользовательских атрибутов
-
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
почти одинаковы.