public List <IEntidade> obterLista(IDataReader dr, int maxLinhas = 0) { List <IEntidade> r = new List <IEntidade>(); Dictionary <String, PropertyInfo> dicTmp = new Dictionary <string, PropertyInfo>(); Type tipo = obterInstancia().GetType(); Dictionary <String, String> mapa = obterMapeamento(); foreach (String k in mapa.Keys) { try { dr.GetOrdinal(mapa[k]); } catch { continue; } PropertyInfo pInfo = tipo.GetProperty(k, new Type[] { }); if (!pInfo.CanWrite) { continue; } dicTmp.Add(k, pInfo); } ConstructorInfo construtor = tipo.GetConstructor(Type.EmptyTypes); if (construtor == null) { throw new Exception(String.Format("Não foi possível localizar um construtor vazio para o tipo {0}.", tipo.FullName)); } int i = 0; while (dr.Read()) { if (maxLinhas > 0 && i == maxLinhas) { break; } AbstractEntidade ent = (AbstractEntidade)construtor.Invoke(null); foreach (String k in dicTmp.Keys) { Object vlObj = dicTmp[k].PropertyType.IsSubclassOf(typeof(AbstractEntidade)) ? dr : dr[mapa[k]]; ent.converterValor(dicTmp[k], dicTmp[k].PropertyType, vlObj); } r.Add(ent); i++; } return(r); }
/// <summary> /// Converte uma lista de dados de um IDataReader para uma lista da classe especificada. /// </summary> /// <typeparam name="Resultado">Tipo da classe que deve ser usada para a conversão.</typeparam> /// <param name="dr">Um IDataReader com dados para conversão.</param> /// <param name="maxLinhas">Se a consulta for muito grande pode-se optar por truncar o números de linhas que sera convertido com este paramentro. /// Zero (Padrão) para conversão total do resultado listado no IDataReader.</param> /// <returns>Retorna uma lista contendo as classes convertidas representando o resultado da consulta do IDataReader.</returns> public static List <Resultado> obterLista <Resultado>(IDataReader dr, int maxLinhas = 0) { Type tipo = typeof(Resultado); ConstructorInfo constructorInfo = tipo.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null); if (constructorInfo == null) { throw new Exception(String.Format("Não foi possível instanciar {0}", tipo.FullName)); } AbstractEntidade obj = (AbstractEntidade)constructorInfo.Invoke(null); return(obj.obterLista(dr, maxLinhas).Cast <Resultado>().ToList()); }
//private String converteMapeamento(String entrada) //{ // String saida = entrada; // if (!String.IsNullOrEmpty(sufixoMapeamento)) // { // saida = String.Format("{0}.{1}", sufixoMapeamento, entrada); // } // return saida; //} protected void converterValor(PropertyInfo pInfo, Type tipoCampo, Object vlObj) { if (vlObj == DBNull.Value) { return; } if (tipoCampo.IsSubclassOf(typeof(AbstractEntidade))) { Mapear mapear = pInfo.obterAtributo <Mapear>(true); if (mapear == null || String.IsNullOrEmpty(mapear.SufixoTabela)) { return; } ConstructorInfo constructorInfo = tipoCampo.GetConstructor(Type.EmptyTypes); if (constructorInfo == null) { throw new Exception(String.Format("Não foi possível instanciar {0}", tipoCampo.FullName)); } AbstractEntidade obj = (AbstractEntidade)constructorInfo.Invoke(null); obj.sufixoMapeamento = mapear.SufixoTabela; if (vlObj is IDataReader) { obj.deReader(vlObj as IDataReader); pInfo.SetValue(obterInstancia(), obj, null); return; } if (typeof(Hashtable) == vlObj.GetType()) { obj.deHashtable(vlObj as Hashtable); pInfo.SetValue(obterInstancia(), obj, null); return; } if (typeof(DataRow) == vlObj.GetType()) { obj.deTable(vlObj as DataRow); pInfo.SetValue(obterInstancia(), obj, null); return; } return; } if (tipoCampo.Name.IndexOf("Nullable") > -1) { tipoCampo = Nullable.GetUnderlyingType(pInfo.PropertyType); } if ((tipoCampo == typeof(int)) && (!(vlObj is int))) { pInfo.SetValue(obterInstancia(), int.Parse(vlObj.ToString()), null); } else if ((tipoCampo == typeof(Char)) && (!(vlObj is char))) { pInfo.SetValue(obterInstancia(), Char.Parse(vlObj.ToString()), null); } else if (tipoCampo.IsEnum) { if (vlObj is string) { pInfo.SetValue(obterInstancia(), Enum.Parse(tipoCampo, vlObj.ToString(), true), null); } else { pInfo.SetValue(obterInstancia(), Enum.ToObject(tipoCampo, vlObj), null); } } else { pInfo.SetValue(obterInstancia(), vlObj, null); } }