Consumindo atributos personalizados
-
20-09-2019 - |
Pergunta
Dando uma olhada na seguinte pergunta, Uso do mundo real de atributos .NET personalizados Como você implementaria a solução proposta pelo @esteban?
Estou um pouco confuso sobre quando e onde o código seria executado, eu acho. Você poderia fornecer uma boa amostra de código.
Eu já fiz essa pergunta antes, mas não a expressou corretamente ... acho que ...
Solução
Com relação à pergunta/resposta que você faz referência, presumo que haveria algum código que seja executado na camada de dados ou na própria classe que faça validação. Esse código usaria a reflexão sobre o objeto que está sendo validado para encontrar as propriedades com diferentes atributos e executar a lógica de validação específica associada a esse atributo nessa propriedade.
Pode parecer algo como o seguinte:
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 ) );
}
}
Outras dicas
No envio (salvar) do formulário HTML (formulário de vitória), você volte a classe de cliente alterada. Para cada propriedade, você verifica se possui atributo personalizado (herdado da ValidationAttribute ou implementando a interface IVALIDOR ou algo assim) associado a ele. Para cada uma dessas propriedades, você chama o método de atributo validate (crie a classe de validação apropriada e ligue para o método Validate) no valor da propriedade.
Você usaria a reflexão:
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;
}
}
Se o membro atribuído for um campo, você usaria FieldInfo
, conforme usado no exemplo. Se for uma propriedade, você usaria PropertyInfo
, os membros de FieldInfo
e PropertyInfo
são praticamente iguais.