<< Click to Display Table of Contents >> Montador.cs |
![]() ![]() ![]() |
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;
}
}
}