Пример #1
0
        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);
        }
Пример #2
0
        /// <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());
        }
Пример #3
0
        //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);
            }
        }