C#반사 적용

5591 단어 C#
이것은 대상 집합으로 되돌아오기 때문에 대상 집합을 데이터 gridview에 연결해야 한다. 데이터 gridview를 연결하려면 데이터 원본이 필요하고 데이터를 조립하면 데이터 테이블로 열을 추가하는 것이 번거롭기 때문에 반사로 실현하면 여러 곳에서 사용할 수 있고 서로 다른 대상이 사용할 수 있기 때문에 범형으로 정의한다.
public class DatatableListHelper<T>
    {
        public static DataTable GetDataTableHelper(List<T> items)
        {
            DataTable dt = new DataTable();
            Type t = items[0].GetType();
            PropertyInfo[] pis = t.GetProperties();
            foreach (PropertyInfo pi in pis)
            {
                dt.Columns.Add(pi.Name);
            }

            foreach (T item in items)
            {
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo pi in pis)
                {
                    object obj = pi.GetValue(item, null);
                    switch (pi.PropertyType.Name.ToString().ToLower())
                    {
                        case "datetime" :
                            dr[pi.Name] = Convert.ToDateTime(obj).ToString("yyyy-MM-dd");
                            break;
                        case "int32":
                            dr[pi.Name] = Convert.ToInt32(obj);
                            break;
                        case "double":
                            dr[pi.Name] = Convert.ToDouble(obj);
                            break;
                        default:
                            dr[pi.Name] = obj;
                            break;
                    }
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
    }

switch에 유형이 완전하지 않아서 유형을 추가해야 합니다
 
반대로 데이터테이블을 대상으로 바꾸면 반사로도 할 수 있을 거예요.
 
public static List<T> GetObjectListHelper(DataTable dt, T obj)
        {
            List<T> list = new List<T>();
            Type type = obj.GetType();
            PropertyInfo[] pis = type.GetProperties();
            foreach (DataRow dr in dt.Rows)
            {
                object o = Activator.CreateInstance(type);
                foreach (PropertyInfo pi in pis)
                {
                    //pi.SetValue(o, dr[pi.Name].ToString(), null);
                    switch (pi.PropertyType.Name.ToString().ToLower())
                    {
                        case "datetime":
                            pi.SetValue(o, Convert.ToDateTime(dr[pi.Name].ToString()), null);
                            break;
                        case "int32":
                            pi.SetValue(o, Convert.ToInt32(dr[pi.Name].ToString()), null);
                            break;
                        case "double":
                            pi.SetValue(o, Convert.ToDouble(dr[pi.Name].ToString()), null);
                            break;
                        default:
                            pi.SetValue(o, dr[pi.Name].ToString(), null);
                            break;
                    }
                }
                T t = (T)o;
                list.Add(t);
            }
            return list;
        }

 
데이터테이블 하나만 올리고 싶었는데 T를 올리고 싶지 않았어요. 좋은 방법이 생각나지 않았어요. 좋은 조언이 있으면 지도해 주세요.

좋은 웹페이지 즐겨찾기