博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# +泛型+自定义属性 实现 DataTable转换成实体类
阅读量:5044 次
发布时间:2019-06-12

本文共 9519 字,大约阅读时间需要 31 分钟。

using System;using System.Collections;using System.Collections.Generic;using System.Text;using System.Data;using System.Reflection;using System.ComponentModel;using System.Diagnostics;namespace XXX.XXX{    ///     /// 数据转换类    /// 说明    :实体,List集合,DataTable相互转换
/// 作者 :niu
/// 创建时间:2011-05-07
/// 最后修改:2011-07-21
///
public class DataConvert { #region DataRow转实体 /// /// DataRow转实体 /// ///
数据型类
/// DataRow ///
模式
public static T DataRowToModel
(DataRow dr) where T : new() { //T t = (T)Activator.CreateInstance(typeof(T)); T t = new T(); if (dr == null) return default(T); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); DataColumnCollection Columns = dr.Table.Columns; foreach (PropertyInfo p in propertys) { string columnName =((DBColumn) p.GetCustomAttributes(typeof(DBColumn),false)[0]).ColName; // string columnName = p.Name;如果不用属性,数据库字段对应model属性,就用这个 if (Columns.Contains(columnName)) { // 判断此属性是否有Setter或columnName值是否为空 object value = dr[columnName]; if (!p.CanWrite || value is DBNull || value == DBNull.Value) continue; try { #region SetValue switch (p.PropertyType.ToString()) { case "System.String": p.SetValue(t, Convert.ToString(value), null); break; case "System.Int32": p.SetValue(t, Convert.ToInt32(value), null); break; case "System.Int64": p.SetValue(t, Convert.ToInt64(value), null); break; case "System.DateTime": p.SetValue(t, Convert.ToDateTime(value), null); break; case "System.Boolean": p.SetValue(t, Convert.ToBoolean(value), null); break; case "System.Double": p.SetValue(t, Convert.ToDouble(value), null); break; case "System.Decimal": p.SetValue(t, Convert.ToDecimal(value), null); break; default: p.SetValue(t, value, null); break; } #endregion } catch(Exception ex) { continue; /*使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构, * 此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型*/ } } } return t; } #endregion #region DataTable转List
///
/// DataTable转List
///
///
数据项类型
///
DataTable ///
List数据集
public static IList
DataTableToList
(DataTable dt) where T : new() { IList
tList = new List
(); if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { T t = DataRowToModel
(dr); tList.Add(t); } } return tList; } #endregion #region DataReader转实体 ///
/// DataReader转实体 /// ///
数据类型
///
DataReader ///
实体
public static T DataReaderToModel
(IDataReader dr) where T : new() { T t = new T(); if (dr == null) return default(T); using (dr) { if (dr.Read()) { // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); List
listFieldName = new List
(dr.FieldCount); for (int i = 0; i < dr.FieldCount; i++) { listFieldName.Add(dr.GetName(i).ToLower()); } foreach (PropertyInfo p in propertys) { string columnName = p.Name; if (listFieldName.Contains(columnName.ToLower())) { // 判断此属性是否有Setter或columnName值是否为空 object value = dr[columnName]; if (!p.CanWrite || value is DBNull || value == DBNull.Value) continue; try { #region SetValue switch (p.PropertyType.ToString()) { case "System.String": p.SetValue(t, Convert.ToString(value), null); break; case "System.Int32": p.SetValue(t, Convert.ToInt32(value), null); break; case "System.DateTime": p.SetValue(t, Convert.ToDateTime(value), null); break; case "System.Boolean": p.SetValue(t, Convert.ToBoolean(value), null); break; case "System.Double": p.SetValue(t, Convert.ToDouble(value), null); break; case "System.Decimal": p.SetValue(t, Convert.ToDecimal(value), null); break; default: p.SetValue(t, value, null); break; } #endregion } catch { //throw (new Exception(ex.Message)); } } } } } return t; } #endregion #region DataReader转List
///
/// DataReader转List
///
///
数据类型
///
DataReader ///
List数据集
public static List
DataReaderToList
(IDataReader dr) where T : new() { List
tList = new List
(); if (dr == null) return tList; T t1 = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t1.GetType().GetProperties(); using (dr) { List
listFieldName = new List
(dr.FieldCount); for (int i = 0; i < dr.FieldCount; i++) { listFieldName.Add(dr.GetName(i).ToLower()); } while (dr.Read()) { T t = new T(); foreach (PropertyInfo p in propertys) { string columnName = p.Name; if (listFieldName.Contains(columnName.ToLower())) { // 判断此属性是否有Setter或columnName值是否为空 object value = dr[columnName]; if (!p.CanWrite || value is DBNull || value == DBNull.Value) continue; try { #region SetValue switch (p.PropertyType.ToString()) { case "System.String": p.SetValue(t, Convert.ToString(value), null); break; case "System.Int32": p.SetValue(t, Convert.ToInt32(value), null); break; case "System.DateTime": p.SetValue(t, Convert.ToDateTime(value), null); break; case "System.Boolean": p.SetValue(t, Convert.ToBoolean(value), null); break; case "System.Double": p.SetValue(t, Convert.ToDouble(value), null); break; case "System.Decimal": p.SetValue(t, Convert.ToDecimal(value), null); break; default: p.SetValue(t, value, null); break; } #endregion } catch { //throw (new Exception(ex.Message)); } } } tList.Add(t); } } return tList; } #endregion #region 泛型集合转DataTable ///
/// 泛型集合转DataTable /// ///
集合类型
///
泛型集合 ///
DataTable
public static DataTable ListToDataTable
(IList
entityList) { if (entityList == null) return null; DataTable dt = CreateTable
(); Type entityType = typeof(T); //PropertyInfo[] properties = entityType.GetProperties(); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); foreach (T item in entityList) { DataRow row = dt.NewRow(); foreach (PropertyDescriptor property in properties) { row[property.Name] = property.GetValue(item); } dt.Rows.Add(row); } return dt; } #endregion #region 创建DataTable的结构 private static DataTable CreateTable
() { Type entityType = typeof(T); //PropertyInfo[] properties = entityType.GetProperties(); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); //生成DataTable的结构 DataTable dt = new DataTable(); foreach (PropertyDescriptor prop in properties) { dt.Columns.Add(prop.Name); } return dt; } #endregion }}
using System;using System.Collections.Generic;using System.Text;namespace XXX.XXX{    ///     /// 数据库字段对应属性类    /// 说明    :数据库字段对应属性类
/// 作者 :niu
/// 创建时间:2011-07-21
/// 最后修改:2011-07-21
///
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Method,AllowMultiple=true,Inherited=false)] public class DBColumn : Attribute { private string _colName; /// /// 数据库字段 /// public string ColName { get { return _colName; } set { _colName = value; } } /* AttributeTargets 枚举 成员名称 说明 All 可以对任何应用程序元素应用属性。 Assembly 可以对程序集应用属性。 Class 可以对类应用属性。 Constructor 可以对构造函数应用属性。 Delegate 可以对委托应用属性。 Enum 可以对枚举应用属性。 Event 可以对事件应用属性。 Field 可以对字段应用属性。 GenericParameter 可以对泛型参数应用属性。 Interface 可以对接口应用属性。 Method 可以对方法应用属性。 Module 可以对模块应用属性。 注意 Module 指的是可移植的可执行文件(.dll 或 .exe),而非 Visual Basic 标准模块。 Parameter 可以对参数应用属性。 Property 可以对属性 (Property) 应用属性 (Attribute)。 ReturnValue 可以对返回值应用属性。 Struct 可以对结构应用属性,即值类型 */ /* 这里会有四种可能的组合: [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]  第一种情况:   如果我们查询Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。  第二种情况:  和第一种情况相同,因为inherited也被设置为false。  第三种情况:  为了解释第三种和第四种情况,我们先来给派生类添加点代码: [Help("BaseClass")] public class Base { } [Help("DeriveClass")] public class Derive : Base { }  现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。  第四种情况:  在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。 */ } }

转载于:https://www.cnblogs.com/HCCZX/archive/2012/07/26/2609389.html

你可能感兴趣的文章
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>
关于React中props与state的一知半解
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>