Thursday, January 19, 2017

Convert a DataReader to List using reflection

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Reflection;
using System.Data;

namespace NetSolDAL
{
    public class clsDTOMapper
    {
        /// <summary>
        /// DTO Type T List
        /// </summary>
        /// <param name="ds"></param>
        /// <returns>List<T></returns>       
        public static List<T> DTOList<T>(SqlDataReader dr)
        {
            List<T> objList = new List<T>();
            T obj = default(T);
            try
            {
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        obj = Activator.CreateInstance<T>();
                        List<string> listColumn = dr.GetSchemaTable().AsEnumerable().Select(f => f[0].ToString()).ToList();
                        PropertyInfo[] propinfo = obj.GetType().GetProperties();

                        foreach (string column in listColumn)
                        {
                            PropertyInfo prop = obj.GetType().GetProperty(column);
                            if (prop != null)
                            {
                                //if (prop.Name != "IDType" && prop.Name != "IDNumber")
                                if (prop.PropertyType.Name != dr[prop.Name].GetType().Name && prop.PropertyType.Name.ToLower() == "string")
                                {
                                    prop.SetValue(obj, Convert.ToString(dr[prop.Name]), null);
                                }
                                else
                                {
                                    if (!string.IsNullOrWhiteSpace(dr[prop.Name].ToString()))
                                        prop.SetValue(obj, dr[prop.Name], null);
                                }
                            }
                        }

                        objList.Add(obj);
                    }
                    dr.NextResult();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }


            return objList;
        }

        /// <summary>
        /// DTO Type T List
        /// </summary>
        /// <param name="ds"></param>
        /// <returns>List<T></returns>       
        public static List<T> DTOListTypes<T>(SqlDataReader dr)
        {
            List<T> objList = new List<T>();
            T obj = default(T);
            try
            {
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        obj = Activator.CreateInstance<T>();
                        List<string> listColumn = dr.GetSchemaTable().AsEnumerable().Select(f => f[0].ToString()).ToList();
                        PropertyInfo[] propinfo = obj.GetType().GetProperties();

                        foreach (string column in listColumn)
                        {
                            PropertyInfo prop = obj.GetType().GetProperty(column);
                            if (prop != null)
                            {
                                //if (prop.Name != "IDType" && prop.Name != "IDNumber")
                                if (prop.PropertyType.Name != dr[prop.Name].GetType().Name && prop.PropertyType.Name.ToLower() == "string")
                                {
                                    prop.SetValue(obj, Convert.ToString(dr[prop.Name]), null);
                                }
                                else
                                {
                                    if (!string.IsNullOrWhiteSpace(dr[prop.Name].ToString()))
                                        prop.SetValue(obj, dr[prop.Name], null);
                                }
                            }
                        }

                        objList.Add(obj);
                    }
                    dr.NextResult();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }


            return objList;
        }

        /// <summary>
        /// DTO type T
        /// </summary>
        /// <param name="ds"></param>
        /// <returns>Object T</returns>
        public static T DTOObject<T>(SqlDataReader dr)
        {
            T obj = default(T);
            try
            {
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        obj = Activator.CreateInstance<T>();
                        List<string> listColumn = dr.GetSchemaTable().AsEnumerable().Select(f => f[0].ToString()).ToList();
                        PropertyInfo[] propinfo = obj.GetType().GetProperties();

                        foreach (string column in listColumn)
                        {
                            PropertyInfo prop = obj.GetType().GetProperty(column);
                            if (prop != null)
                            {
                                if (prop.PropertyType != dr[prop.Name].GetType())
                                {
                                    if (prop.PropertyType == typeof(string))
                                        prop.SetValue(obj, Convert.ToString(dr[prop.Name]), null);

                                    if (prop.PropertyType == typeof(Int32))
                                        if (dr[prop.Name].GetType() != typeof(DBNull))
                                            prop.SetValue(obj, Convert.ToInt32(dr[prop.Name]), null);
                                }
                                else
                                {
                                    prop.SetValue(obj, dr[prop.Name], null);
                                }
                            }
                        }
                    }
                    dr.NextResult();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return obj != null ? obj : Activator.CreateInstance<T>();
        }



    }
}