Montador.cs

<< Click to Display Table of Contents >>

Navigation:  Persistencia > Persistencia > classes >

Montador.cs

Previous pageReturn to chapter overviewNext page

using System;

using System.Collections.Generic;

using System.Reflection;

using Modelo.classes;

 

namespace Persistencia.classes

{

    /// <summary>

    /// classe usada para obter o nome da tabela, lista de campos e valores dos campos a partir de um object do model

    /// não é usada diretamente, mas uma classe auxiliar da classe DAL. Tanto é que nem é pública

    /// </summary>

    class Montador

    {

        /// <summary>

        /// procura nos atributos do tipo ex: typeof(Pessoa)

        /// um atributo do tipo "TabelaAtributo"

        /// retorna o nome da tabela se achar

        /// </summary>

        /// <param name="tipo">tipo do objeto, declare typeof(Classe)</param>

        /// <returns>retorna o nome da tabela</returns>

        public static string GetTableName(object obj)

        {

            // usa reflection para extrair os "Custom" atributes - aqueles criados manualmente 

            Attribute[] atributos = Attribute.GetCustomAttributes(obj.GetType());

 

            // percorre todos estes atributos

            foreach (Attribute atributo in atributos)

            {

                // achou atributo tabela? é esse!

                if (atributo is TabelaAttribute)

                {

                    // retorna no nome

                    TabelaAttribute tabela = (TabelaAttribute)atributo;

                    return tabela.Nome;

                }

            }

            return string.Empty;

        }

 

        /// <summary>

        /// método que recebe uma instância de uma instância de classe e um tipo

        /// pega os membros desse tipo e lê atributos custom

        /// para retornar o nome do campo (retorna num list de campo)

        /// e também busca na instância da classe (primeiro parametro) o valor

        /// </summary>

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

        /// <returns>retorna um list de Campo que contém o nome do campo e valor a ser gravado na base</returns>

        public static List<Campo> GetCampos<T>(T t)

        {

            // cria o retorno vazio

            List<Campo> retorno = new List<Campo>();

 

            // 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 que será associado com Campo.Valor

            // 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)

                    {

                        CampoAttribute da = (CampoAttribute)attribute;

                        // adiciona numa list um "Campo" que contém nome da propriedade e do campo

                        Campo campo = new Campo();

                        campo.IsKey = da.IsKey;

                        campo.IsFK = da.IsFK;

                        campo.Nome = da.FieldName;

                        campo.Required = da.Required;

 

                        // 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))

                            {

                                campo.Valor = property.GetValue(t, null);

                                // já aproveita e preenche o tipo para uso nos "where" de selects"

                                campo.Tipo = ((PropertyInfo)member).PropertyType;

                                break;

                            }

                        retorno.Add(campo);

                    }

                }

            }

            return retorno;

        }

 

        /// <summary>

        /// Retornar o id do campo Mestre encontrado no objeto (trabalha só com 1 campo key)

        /// </summary>

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

        /// <returns>retorna um long com código do id</returns>

        public static long GetKeyId<T>(T t)

        {

            // para comentários deste fonte, veja o GetCampos acima

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

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

 

            foreach (MemberInfo member in members)

            {

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

 

                if (member.MemberType != MemberTypes.Property)

                    continue;

 

                if (attributes.Length == 0)

                    continue;

 

                foreach (object attribute in attributes)

                    if (attribute is CampoAttribute)

                    {

                        CampoAttribute da = (CampoAttribute)attribute;

 

                        if (!da.IsKey)

                            continue;

 

                        foreach (PropertyInfo property in properties)

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

                            {

                                object valor = property.GetValue(t, null);

                                if (valor.GetType() == typeof(int))

                                    return (int)valor;

                                else

                                    return 0;

                            }

                    }

            }

            return 0;

        }

 

        /// <summary>

        /// Retornar o nome do campo FK

        /// </summary>

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

        /// <returns>retorna um string com nome do campo FK</returns>

        public static string GetFieldFK<T>(T t)

        {

            // para comentários deste fonte, veja o GetCampos acima

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

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

 

            foreach (MemberInfo member in members)

            {

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

 

                if (member.MemberType != MemberTypes.Property)

                    continue;

 

                if (attributes.Length == 0)

                    continue;

 

                foreach (object attribute in attributes)

                    if (attribute is CampoAttribute)

                    {

                        CampoAttribute da = (CampoAttribute)attribute;

                        if (da.IsFK)

                        {

                            return da.FieldName;

                        }

                    }

            }

            return string.Empty;

        }

    }

}