Validador.cs

<< Click to Display Table of Contents >>

Navigation:  Persistencia > Persistencia > classes >

Validador.cs

Previous pageReturn to chapter overviewNext page

using System.Reflection;

using Modelo.classes;

 

namespace Persistencia.classes

{

    public static class Validador

    {

        /// <summary>

        /// A classe Validator é usada para descobrir se alguma propriedade obrigatória não foi preenchido

        /// </summary>

        /// <param name="t">instância da classe, exemplo: pessoa</param>

        /// <param name="mensagem">parametro de saída - mensagem para ser exibida em caso de campo obrigatório não preenchido</param>

        /// <returns>retorna true se todos os campos required estão preenchidos</returns>

        public static bool IsValid<T>(T t, out string mensagem, out string nome)

        {

            // reflection que pega os membros de um tipo

            MemberInfo[] members = t.GetType().GetMembers();

 

            // aqui pegamos as propriedades o objeto "T" onde vamos encontrar o valor do objeto

            // pega as propriedades e os valores do objeto

            var properties = t.GetType().GetProperties();

 

            // pra cada membro...

            foreach (MemberInfo member in members)

            {

                // pega os atributos custom (que eu criei) dos membros e joga num object[]

                object[] attributes = member.GetCustomAttributes(true);

 

                // se o membro for diferente tipo Property (pode ser Method, Public,) pula

                if (member.MemberType != MemberTypes.Property)

                    continue;

 

                // não tem atributos? então pula

                if (attributes.Length == 0)

                    continue;

 

                // percorre os atributos customizados (neste exemplo só tem 1: CampoAttribute)

                foreach (object attribute in attributes)

                {

                    // se o atributo for CampoAttribute...

                    if (!(attribute is CampoAttribute))

                        continue;

 

                    CampoAttribute atributo = (CampoAttribute)attribute;

 

                    // não é obrigatório? pula...

                    if (!atributo.Required)

                        continue;

 

                    // percorre as propriedades do objeto e procura uma propriedade com mesmo nome do member.Nome

                    // achou? então já temos o valor

                    foreach (PropertyInfo property in properties)

                    {

                        // encontrou com mesmo nome?

                        if (!member.Name.ToString().Equals(property.Name))

                            continue;

 

                        if (property.GetValue(t, null) == null)

                        {

                            mensagem = "O preenchimento de " + (string.IsNullOrEmpty(atributo.Descricao) ? atributo.FieldName : atributo.Descricao) + " é obrigatório";

                            nome = property.Name;

                            return false;

                        }

                        break;

                    }

                }

            }

            mensagem = string.Empty;

            nome = string.Empty;

            return true;

        }

    }

}