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-11-05 06:27:43