DateTable映射到对象的字段和属性

DateTable映射到对象的字段和属性

简介:

作为一个菜鸟,因该有颗不甘做菜鸟的心。这里介绍一个C#中比较高级点的技术,反射技术。曾经有人说过当你懂了反射技术,就告别了菜鸟。这里先介绍一个反射的有趣例子。接下几天后来个系列讲解,希望大家收看。

问题:

将dataTable中的数据映射到对象的字段和属性。也是现在好多软件做的关系-对象映射技术。这里新建一个控制台程序。

实现小例子

1、首先创建一个用于实例化对象的类

<span style="font-size:18px;">classFoo

    {

        publicstring Username = "";

        publicint Level { get; set; }

}</span>

2、创建数据源

<span style="font-size:18px;">staticDataTable GetTable()

        {

            DataTable dt = newDataTable();

           dt.Columns.Add("Username");

           dt.Columns.Add("Level", typeof(int));

           dt.Rows.Add("John", 1);

           dt.Rows.Add("Cait", 2);

            return dt;

        }</span>
4、映射单个对象方法
<span style="font-size:18px;">  //一个实例绑定

        static  T BindData<T>(DataTable dt)

        {

            DataRow dr = dt.Rows[0];

            // Get all columns'name

            List<string> columns = newList<string>();

            foreach (DataColumn dc in dt.Columns)

            {

               columns.Add(dc.ColumnName);

            }
            // Create object

            var ob = Activator.CreateInstance<T>();
            // Get all fields

            var fields = typeof(T).GetFields();

            foreach (var fieldInfo in fields)

            {

                if(columns.Contains(fieldInfo.Name))

                {

                   //Fill the data into the field

                   fieldInfo.SetValue(ob, dr[fieldInfo.Name]);

                }

            }
            // Get allproperties

            var properties = typeof(T).GetProperties();

            foreach (var propertyInfo in properties)

            {

                if(columns.Contains(propertyInfo.Name))

                {

                   //Fill the data into the property

                   propertyInfo.SetValue(ob, dr[propertyInfo.Name]);

                }

            }
            return ob;

        }</span>

5、映射整个集合方法

 

 //实例列绑定

        staticList<T>BindDataList<T>(DataTable dt)

        {

            List<string> columns = newList<string>();

            foreach (DataColumn dc in dt.Columns)

            {

               columns.Add(dc.ColumnName);

            }
            var fields = typeof(T).GetFields();

            var properties = typeof(T).GetProperties()
            List<T> lst = newList<T>();

            foreach (DataRow dr in dt.Rows)

            {

                var ob = Activator.CreateInstance<T>();

                foreach (var fieldInfo in fields)

                {

                   if(columns.Contains(fieldInfo.Name))

                   {

                       fieldInfo.SetValue(ob, dr[fieldInfo.Name]);

                   }

                }

                foreach (var propertyInfo in properties)

                {

                   if(columns.Contains(propertyInfo.Name))

                   {

                       propertyInfo.SetValue(ob, dr[propertyInfo.Name]);

                   }

                }
               lst.Add(ob);

            }

            return lst;

        }

运行程序:

<span style="font-size:18px;">staticvoid Main(string[] args)

        {

            DataTable dt = GetTable();

            Foo foo = BindData<Foo>(dt);

            Console.WriteLine("输出单个实体转化");

            Console.Write("名字:{0},  ",foo.Username);

            Console.Write("Level:{0}",foo.Level);

            Console.WriteLine();

            List<Foo> lstFoo =BindDataList<Foo>(dt);

            Console.WriteLine("输出实体集合转化");

            foreach (Foo obj in lstFoo)

            {

                Console.Write("名字:{0},  ", obj.Username);

                Console.Write("Level:{0}",obj.Level);

                Console.WriteLine();

            }

            Console.Read();

        }</span>

结论:

    复杂的事情都是有很多简单是事情组成,一点一点早日摆脱菜鸟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值