【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#】利用反射构建实体,布布扣,bubuko.com

时间: 2024-12-21 21:48:14

【C#】利用反射构建实体的相关文章

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

利用反射机制动态的调用类信息

public class reflectTest { /** * 利用反射设置实体类的属性 * * @return * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchFieldException * @throws SecurityException * @throws NoSuchMethodException *

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

DataRow转泛型,利用反射将查询数据直接转成实体

前言,此方法利用反射将DataRow转成实体,由于反射SetValue据说性能不行,大家就看看就行了吧. using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; namespace WangSql.DBUtility { public class DataMapHelper { private

利用反射将IDataReader读取到实体类中效率低下的解决办法

原文:利用反射将IDataReader读取到实体类中效率低下的解决办法 最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例化一个List<>泛型集合 List<T> DataList = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties()

利用反射模拟一个spring的内部工作原理

这个简单的案例是实行了登录和注册的功能,没有链接数据库. 在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\.... 1 package com.obtk.reflect; 2 3 public class Logon { 4 /** 5 * 帐号密码长度大于六位字符就成功,否则失败! 6 * */ 7 public String select(String name, String pass) { 8 if (name.length()

第二节:使用反射构建动态可扩展应用程序

众所周知,元数据时是用一系列表来存储的.生成一个程序集或模块时,编译器会创建一个类型定义表,一个字段定义表,一个方法定义表以及其他表.利用System.Reflection命名空间中包含的一些类型,可以写代码来反射这些元数据.实际上,这个命名空间中的类型为程序集或模块中包含的元数据创建了一个对象模型. 利用这个对象模型中的类型,可轻松枚举一个类型定义元数据表中的所有类型.然后,针对每个类型,都可以获取它的基类型,它实现的一些接口以及与类型关联的一些标志.利用System.Reflection命名