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>

结论:

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

时间: 2024-08-29 20:43:09

DateTable映射到对象的字段和属性的相关文章

Dream------scala--类的属性和对象私有字段实战详解

Scala类的属性和对象私有字段实战详解 一.类的属性 scala类的属性跟java有比较大的不同,需要注意的是对象的私有(private)字段 1.私有字段:字段必须初始化(当然即使不是私有字段也要赋值) 2.属性默认是public级别的,而且无法用public修饰. 3.可以有很多类,并且默认是public级别(如果声明的时候加上会报错,不知为何) 4.如果属性是public的,会默认生成类属性的getter和setter方法,无需显示的提供getter,setter方法 5.私有字段(用p

007-Scala类的属性和对象私有字段实战详解

007-Scala类的属性和对象私有字段实战详解 Scala类的使用实战 变量里的类必须赋初值 def函数时如果没参数可不带括号 2.不需要加Public声明 getter与setter实战 getter方法:def age setter方法:def age_ var 变量默认生成getter和setter方法 val默认只生成getter方法 对象私有属性实战 变量声明为private后这个变量只能在这个类的内部使用 private[this]对象私有属性 这个类自己的方法只能访问自己的对象的

[转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题

原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.

JPA——映射持久化对象(Entity)

一个普通的POJO类通过@Entity可以映射成为可持久化的类: 类JavaBean风格:·类属性必须为private:·有Getter和Setter方法: 映射实体:@Entity# @Entity实体必须有一个无参的构造方法:# 实现Serializable接口,建议每一个Entity都实现该接口:# 其中,Entity中,name属性表示实体的名称,比如:@Entity(name=Contacts)public class ContactsEO{...}在JPA执行jpql的时候,需要使用

jQuery基础(样式篇,DOM对象,选择器,属性样式)

1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真正的的被加载完毕后才能正确的使用. $(document).ready(function() {   内容  }); 1.jQuery对象与DOM对象   jQuery对象与DOM对象是不一样的 普通处理,通过标准JavaScript处理: var p = document.getElementById

字段和属性的区别

可以理解为字段是类内部用的,属性是类外部用的. 下面是个C#写的例子,这个例子作用是可以通过属性获取时间值,但是只能通过SetTime()方法设定时间值,我想这也是为什么要分字段和属性的一大原因吧. 首先声明的是private类型的变量(字段)hours,通常字段写法都是加个"_"符号,然后声明只读属性hours. 在类内部可以通过变量(字段)对其进行读写,在类外部不能访问变量(字段),只能访问属性.而且在此例内如果想修改时间值,只能通过调用SetTime()方法往里传值(因为这里的各

C#:字段与属性

MSDN中是这么介绍字段和属性的: A field is a variable of any type that is declared directly in a class or struct. 字段:“字段”是直接在类或结构中声明的任何类型的变量. A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field.Properti

C#.NET中的字段与属性_1

一个类中需要有描述这个类信息的数据,而存储这些数据的变量就成为字段. 字段默认的访问级别为private(只有本类可以直接访问),我们将其访问级别改为public,在其他类中就可以访问了. 字段和属性表示对象包含的信息,字段类似于变量,因为可以直接读取或设置他们. 属性是对字段的封装.属性可以对字段的访问进行控制,可以进行非法设置值的判断.属性并不存储数据,字段存储数据. 封装后,有一些字段我只能赋值,不能读取,有些只能读取,不能赋值,而且可以对传过来的值进行选择. 建议所有的字段不要写成pub

C#.NET中的字段与属性_2 为什么要用属性

属性的好处,就是对存入公共变量的值可以进行处理,如果觉得该值不合法,可以就地变换或者直接提出警告,只不过多花了点点时间,所以有一点点慢.但对于该类所生成的对象的使用安全,还是有相当多的好处的,至少运行时,因公共变量值的错误而产生的问题会大大减少. 用公共变量速度快,就是因为少了中间处理的环节,但是也因此更直接地对类的内容进行了操作和控制,比起属性的使用来说,相对的安全性就变低了. 应该说属性与公共变量各有各的用途,否则公共量变就会被取消掉. 公共变量的好处,就是快.但由于这种用法必须开放变量访问