public List <string> ObtenhaConceitosComPortadorVinculados() { var conceitosComPortador = typeof(TEntidade).GetProperties() .Where(x => GSUtilitarios.VerifiqueSePropriedadeEhEntidadeRelacionalUmParaMuitos(x)); var listaRetorno = new List <string>(); foreach (var conceito in conceitosComPortador) { Type tipoElementos = GSUtilitarios.ObtenhaTipoLista(conceito.GetValue(conceito, null) as List <dynamic>); Type tipoChaveElementos = GSUtilitarios.EncontrePropriedadeChaveDoTipo(tipoElementos).PropertyType; var servicoMapeadorElementosLista = Activator.CreateInstance(null, Namespaces.MAPEADORES_CONCRETOS + ".Mapeador" + tipoElementos.Name).Unwrap() as IDisposable; var listaElementos = GSUtilitarios.CrieLista(tipoElementos); listaElementos = servicoMapeadorElementosLista.GetType() .GetMethod("Consulte", new Type[] { tipoElementos, tipoChaveElementos }) .Invoke(servicoMapeadorElementosLista, new object[] { tipoElementos, tipoChaveElementos }) as List <dynamic>; servicoMapeadorElementosLista.Dispose(); if (listaElementos.Count > 0) { listaRetorno.Add(tipoElementos.Name); } } return(listaRetorno); }
protected TEntidade MonteRetorno(DataTable tabela, int linha) { var retorno = new TEntidade(); foreach (var propriedade in retorno.GetType().GetProperties()) { if (GSUtilitarios.VerifiqueSePropriedadeEhEntidadeRelacionalUmParaMuitos(propriedade)) { Type tipoElementos = GSUtilitarios.ObtenhaTipoListaPropriedade(propriedade); var listaElementos = GSUtilitarios.CrieLista(tipoElementos); var servicoMapeadorLista = Activator.CreateInstance(null, Namespaces.MAPEADORES_CONCRETOS + ".Mapeador" + tipoElementos.Name).Unwrap() as IDisposable; var valorChave = retorno.GetType() .GetProperty(GSUtilitarios.EncontrePropriedadeChaveDoObjeto(retorno).Name) .GetValue(retorno, null); listaElementos = servicoMapeadorLista.GetType() .GetMethod("Consulte", new Type[] { typeof(Type), typeof(int) }) .Invoke(servicoMapeadorLista, new object[] { retorno.GetType(), valorChave }) as List <dynamic>; servicoMapeadorLista.Dispose(); propriedade.SetValue(retorno, listaElementos); } else { var dado = tabela.Rows[linha][propriedade.Name.ToUpper()]; if (propriedade.PropertyType.Equals(typeof(string))) { propriedade.SetValue(retorno, dado != DBNull.Value ? dado : null); } else if (GSUtilitarios.ChequeSeTipoEhBuiltIn(propriedade.PropertyType) && !GSUtilitarios.VerifiqueSeTipoEhLista(propriedade.PropertyType)) { propriedade.SetValue(retorno, propriedade.PropertyType .GetMethod("Parse", new Type[] { typeof(string) }) .Invoke(null, new object[] { dado != DBNull.Value ? dado.ToString() : null })); } else { if (!GSUtilitarios.VerifiqueSeTipoEhLista(propriedade.PropertyType)) { Type tipoChave = GSUtilitarios.EncontrePropriedadeChaveDoTipo(propriedade.PropertyType).PropertyType; dynamic valor; if (propriedade.PropertyType.Equals(typeof(string))) { valor = dado != DBNull.Value ? dado : null; } else { if (dado == DBNull.Value) { valor = null; continue; } valor = tipoChave.GetMethod("Parse", new Type[] { typeof(string) }) .Invoke(null, new object[] { dado.ToString() }); var servicoMapeadorPropriedadeComplexa = Activator.CreateInstance(null, Namespaces.MAPEADORES_CONCRETOS + ".Mapeador" + propriedade.Name).Unwrap() as IDisposable; valor = servicoMapeadorPropriedadeComplexa.GetType() .GetMethod("Consulte", new Type[] { tipoChave }) .Invoke(servicoMapeadorPropriedadeComplexa, new object[] { valor }); servicoMapeadorPropriedadeComplexa.Dispose(); } propriedade.SetValue(retorno, valor); } } } } return(retorno); }