/// <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) { // pega lista de propriedades List <PropertyInfo> propriedades = Auxiliar.GetListOfProperties(t); // percorre estas destas propriedades e verifica se tem o atributo [Key] foreach (PropertyInfo propriedade in propriedades) { // pegamos atributos que são KeyAttribute var atributos = from attr in propriedade.GetCustomAttributes(true) where attr is KeyAttribute select attr; // não tem KeyAttribute? pega a próxima propriedade if (atributos != null && atributos.Count() > 0) { // pega o valor da propriedade object valor = propriedade.GetValue(t, null); if (valor.GetType() == typeof(int)) { return((int)valor); } } } throw new Exception("Não encontrada propriedade KeyAttribute de " + t.ToString()); }
/// <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) { // resposta padrão mensagem = string.Empty; nome = string.Empty; // reflection que pega os membros de um tipo List <PropertyInfo> propriedades = Auxiliar.GetListOfProperties(t); // vamos percorrer todas as propriedades foreach (PropertyInfo propriedade in propriedades) { // pegamos os "CustomAtributes" da propriedade object[] attributes = propriedades.First().GetCustomAttributes(true); // pegamos apenas o atributo RequiredAttribute var atributo = from attr in attributes where attr is RequiredAttribute select attr; // não tem required? ignora a propriedade if (atributo == null) { continue; } // se tem required, vamos buscar informações da coluna atributo = from attr in attributes where attr is ColumnAttribute select attr; // tem? if (atributo != null && atributo.Count() > 0) { // pega atributo ColumnAttribute ca = (atributo.First() as ColumnAttribute); if (propriedade.GetValue(t, null) == null) { // verifica se tem atributo de Display (nome informativo) var display = from attr in attributes where attr is DisplayAttribute select attr; mensagem = "O preenchimento de " + (display == null ? ca.Name : (display.First() as DisplayAttribute).Name) + " é obrigatório"; nome = propriedade.Name; return(false); } } } return(true); }
/// <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>(); // pega lista de propriedades List <PropertyInfo> propriedades = Auxiliar.GetListOfProperties(t); try { // percorre estas destas propriedades foreach (PropertyInfo propriedade in propriedades) { // pegamos atributos desta propriedade object[] atributos = propriedade.GetCustomAttributes(true); // não tem atributos, pula if (atributos == null || atributos.Count() == 0) { continue; } Campo campo = new Campo(); // percorre os atributos customizados (neste exemplo só tem 1: CampoAttribute) foreach (object atributo in atributos) { // esse SetProperties volta true se obter o atributo ColumnAttribute, nos demais false if (Montador.SetProperties(atributo, campo)) { // já percorre as propriedades do objeto e procura uma propriedade com mesmo nome do member.Nome // achou? então já temos o valor deste campo (usado no insert, update) campo.Valor = propriedade.GetValue(t, null); // já aproveita e preenche o tipo para uso nos "where" de selects" campo.Tipo = propriedade.PropertyType; } } // se tem valor adiciona a lista if (!string.IsNullOrEmpty(campo.Nome)) { retorno.Add(campo); } } } catch (Exception e) { } return(retorno); }
/// <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) { // pega lista de propriedades List <PropertyInfo> propriedades = Auxiliar.GetListOfProperties(t); // percorre estas destas propriedades e verifica se tem o atributo [Key] foreach (PropertyInfo propriedade in propriedades) { // pegamos atributos que são FK var atributos = from attr in propriedade.GetCustomAttributes(true) where attr is ForeignKeyAttribute select attr; // não tem KeyAttribute? pega a próxima propriedade if (atributos != null && atributos.Count() > 0) { return((atributos.First() as ForeignKeyAttribute).Name); } } return(string.Empty); }