zoukankan      html  css  js  c++  java
  • 【C#】利用反射构建实体

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Reflection;
    
    namespace RftToModel {
        class Program {
            static void Main(string[] args) {
    
                var result = ToModel<TestModel>.GetDelegate_ToModelList(BuildSampleTable());
    
                foreach (var item in result) {
                    Console.WriteLine(item);
                }
    
                Console.Read();
    
            }
    
            static DataTable BuildSampleTable() {
                DataTable result = new DataTable();
                result.Columns.Add("ID", typeof(int));
                result.Columns.Add("Name", typeof(string));
                result.Columns.Add("IsDeleted", typeof(bool));
    
    
                result.Rows.Add(new object[] { 1, "M.K", false });
                result.Rows.Add(new object[] { 2, "B.G", true });
    
    
                return result;
    
            }
    
        }
    
    
        public class TestModel {
            public int ID { get; set; }
            public string Name { get; set; }
            public bool IsDeleted { get; set; }
    
            public override string ToString() {
                return string.Format("ID:{0} Name:{1} IsDeleted:{2}", ID, Name, IsDeleted);
            }
        }
    
    
        public delegate void SetValue<T>(T value);
    
        public static class ToModel<T> where T : class, new() {
    
            private static Delegate CreateSetDelegate(T model, string propertyName) {
                MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
                //这里构造泛型委托类型
                Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
    
                return Delegate.CreateDelegate(delType, model, mi);
            }
    
            private static Type GetPropertyType(string propertyName) {
                return typeof(T).GetProperty(propertyName).PropertyType;
            }
    
            public static IList<T> GetDelegate_ToModelList(DataTable dt) {
                IList<T> list = new List<T>();
                if (dt == null || dt.Rows.Count < 1) return list;
    
                Delegate setDelegate;
                foreach (DataRow dr in dt.Rows) {
                    T model = new T();
                    foreach (DataColumn dc in dt.Columns) {
                        setDelegate = CreateSetDelegate(model, dc.ColumnName);
                        //这里改变类型
                        setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], GetPropertyType(dc.ColumnName)));
                    }
                    list.Add(model);
                }
                return list;
            }
        }
    
    }
    

      

  • 相关阅读:
    C++里面关于虚函数的一些注意点
    HDOJ 2736 Surprising Strings
    hdu
    hdu 4404 Worms(多边形与圆的交)
    HTC one/M7电信802d 毒蛇ViperOne2.1.0/高级毒蛇工具/完美root,精简/更多自定义,稳定,流畅ROM
    Replace
    Centos环境下部署游戏服务器-权限
    jdk1.6与1.7垃圾回收
    java--基于socket的网络传输开发
    番外:android模拟器连不上网
  • 原文地址:https://www.cnblogs.com/wywnet/p/3799079.html
Copyright © 2011-2022 走看看