/// <summary>
/// 扩展方法类
/// </summary>
public static class CommonExtension
{
/// <summary>
/// 数据类型对应转换方法字典
/// </summary>
static Dictionary<Type, Func<object, object>> dic_convert = new Dictionary<Type, Func<object, object>>(); /// <summary>
/// 构造函数
/// </summary>
static CommonExtension()
{
Func<object, object> f = null;
//string
f = (val) => Convert.ToString(val);
dic_convert.Add(typeof(string), f);
//int
f = (val) => Convert.ToInt32(val);
dic_convert.Add(typeof(int), f);
//long
f = (val) => Convert.ToInt64(val);
dic_convert.Add(typeof(long), f);
//double
f = (val) => Convert.ToDouble(val);
dic_convert.Add(typeof(double), f);
//float
f = (val) => (float)(val);
dic_convert.Add(typeof(float), f);
//decimal
f = (val) => Convert.ToDecimal(val);
dic_convert.Add(typeof(decimal), f);
//datetime
f = (val) => Convert.ToDateTime(val);
dic_convert.Add(typeof(DateTime), f);
//bool
f = (val) => Convert.ToBoolean(val);
dic_convert.Add(typeof(bool), f);
//byte
f = (val) => Convert.ToByte(val);
dic_convert.Add(typeof(byte), f);
//char
f = (val) => Convert.ToChar(val);
dic_convert.Add(typeof(char), f);
//null
f = (val) => (null);
dic_convert.Add(typeof(DBNull), f);
}
/// <summary>
/// 获取DataTable的列名集合
/// </summary>
public static IList<string> GetColumnNames(this DataTable dt)
{
if (dt == null || dt.Rows.Count == )
{
return new List<string>();
}
//由于集合中的元素是确定的,所以可以指定元素的个数,系统就不会分配多余的空间,效率会高点
IList<string> list = new List<string>(dt.Columns.Count);
foreach (DataColumn dc in dt.Columns)
{
list.Add(dc.ColumnName);
} return list;
} /// <summary>
/// 将 DataTable 序列化成 json 字符串
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string ToJson(this DataTable dt)
{
if (dt == null || dt.Rows.Count == )
{
return "[]";
}
JavaScriptSerializer myJson = new JavaScriptSerializer(); List<Dictionary<string, object>> list = new List<Dictionary<string, object>>(); foreach (DataRow dr in dt.Rows)
{
Dictionary<string, object> result = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
result.Add(dc.ColumnName, dr[dc].ToString());
}
list.Add(result);
}
return myJson.Serialize(list);
} /// <summary>
/// 将 DataTable 序列化成 ArrayList
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static ArrayList ToArrayList(this DataTable dt)
{
ArrayList arrayList = new ArrayList();
if (dt != null)
{
foreach (DataRow dataRow in dt.Rows)
{
Dictionary<string, object> dictionary = new Dictionary<string, object>(); //实例化一个参数集合
foreach (DataColumn dataColumn in dt.Columns)
{
dictionary.Add(dataColumn.ColumnName, dataRow[dataColumn.ColumnName].ToString());
}
arrayList.Add(dictionary);
}
}
return arrayList;
} /// <summary>
/// 把DataTable转换成泛型列表
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt) where T : new()
{
var list = new List<T>();
if (dt == null || dt.Rows.Count == )
{
return list;
}
// 获得此模型的公共属性
var plist = new List<PropertyInfo>(typeof(T).GetProperties());
// 循环行
foreach (DataRow row in dt.Rows)
{
var t = new T();
// 循环列
foreach (DataColumn dc in dt.Columns)
{
var value = row[dc.ColumnName];
// 判断值是否有效
if (Convert.IsDBNull(value))
continue; //var p = info.GetType().GetProperty(dc.ColumnName);
var p = plist.FirstOrDefault(c => c.Name.Equals(dc.ColumnName, StringComparison.CurrentCultureIgnoreCase));
// 判断此属性是否有Setter
if (p == null || !p.CanWrite)
continue; if (dic_convert.ContainsKey(p.PropertyType))
{
var val = dic_convert[p.PropertyType].Invoke(value);
p.SetValue(t, val, null);
}
}
list.Add(t);
}
dt.Dispose();
dt = null; return list;
} /// <summary>
/// 将DataTable实例转换成List<T>
/// </summary>
/// <typeparam name="T">Model类型</typeparam>列表
/// <param name="dt">DataTable对象</param>
/// <returns></returns>
public static List<T> ToListSmart<T>(this DataTable dt) where T : new()
{
// 定义集合
List<T> list = new List<T>();
if (dt == null || dt.Rows.Count == )
{
return list;
}
// 获得此模型的类型
Type type = typeof(T);
// 获得此模型的公共属性
var plist = new List<PropertyInfo>(type.GetProperties());
// 获取列的个数
int col_cnt = dt.Columns.Count;
T t;
if (plist.Count >= col_cnt)
{
#region 循环列给属性赋值方式
foreach (DataRow row in dt.Rows)
{
t = new T();
// 循环列
foreach (DataColumn dc in dt.Columns)
{
// 根据列名查找属性
PropertyInfo pi = plist.Find(p => p.Name.Equals(dc.ColumnName, StringComparison.CurrentCultureIgnoreCase));
if (pi != null)
{
// 判断此属性是否有Setter
if (!pi.CanWrite)
continue;
// 判断值是否有效
if (Convert.IsDBNull(row[pi.Name]))
continue; if (dic_convert.ContainsKey(pi.PropertyType))
{
var val = dic_convert[pi.PropertyType].Invoke(row[pi.Name]);
pi.SetValue(t, val, null);
}
}
}
list.Add(t);
}
#endregion
}
else
{
#region 循环属性查找列对应的值
foreach (DataRow row in dt.Rows)
{
t = System.Activator.CreateInstance<T>();
// 循环属性列表
foreach (PropertyInfo pi in plist)
{
// 检查DataTable是否包含此列
if (dt.Columns.Contains(pi.Name))
{
// 判断此属性是否有Setter
if (!pi.CanWrite)
continue;
// 判断值是否有效
if (row[pi.Name] == DBNull.Value)
continue; if (dic_convert.ContainsKey(pi.PropertyType))
{
var val = dic_convert[pi.PropertyType].Invoke(row[pi.Name]);
pi.SetValue(t, val, null);
}
}
}
list.Add(t);
}
#endregion
} return list;
} #endregion
}

DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()的更多相关文章

  1. C# DataTable扩展方法

    在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...

  2. C#中DataTable与实体集合通用转换(使用扩展方法)

    本案例提供了:把DataRow转换为单个实体.dataTable转换为List泛型支持时间格式转换. 下文的方法都是扩展方法.扩展方法要求写在静态类中,方法也要静态. 它必须在一个非嵌套.非泛型的静态 ...

  3. 【转】给DataTable和DataRow扩展方法,直接转换为对象集合或对象

    /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为对象集合或对象 /// 补充说明:此扩展类可以极大的简化操作,但是性能低下,大数据以 ...

  4. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  5. C#扩展方法 DataTable.ToEntitys

    类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加功能到类A中去,怎么办? 这个时候扩展方法(Extension ...

  6. (原创)[C#] DataTable排序扩展方法

    一,前言 DataTable的应用极其广泛,对DataTable进行排序也有很多方式,每种的实现方式都不难,但是使用起来却比较繁琐,所以本人便写了一个扩展方法,专门对DataTable进行操作. 本篇 ...

  7. C# 用this修饰符为原始类型扩展方法

    特点:1.静态类 2.静态方法 3.第一个参数前加this 例如:public static List<T> ToList<T>(this string Json),就是为th ...

  8. Farseer.net轻量级开源框架 中级篇:常用的扩展方法

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...

  9. 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇

    最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...

随机推荐

  1. taskkill批量删除进程命令

    本人自用: TASKKILL /F /IM notepad --强制删除进程名中带notepad的所有进程 TASKKILL [/S system [/U username [/P [password ...

  2. pk8和x509.pem转换成keystore

    转自:http://www.cnblogs.com/platte/p/3511814.html 一 在github上下载工具 https://github.com/getfatday/keytool- ...

  3. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  4. Kafka基本原理

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...

  5. 更换项目jdk版本

    现在开发用的都是1.7版本,但是以前老的服务器上可能是1.6jdk,这时候就需要我们将项目重新用1.6编译; 修改三个文件(三个地方)即可; 第一步,右键单击项目,选择properties,修改1:J ...

  6. Hadoop 全分布模式 平台搭建

    现将博客搬家至CSDN,博主改去CSDN玩玩~ 传送门:http://blog.csdn.net/sinat_28177969/article/details/54138163 Ps:主要答疑区在本帖 ...

  7. AOP详解

    什么是AOP AOP Aspect Oriented Programing 面向切面编程 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) Spring ...

  8. SGIP、SMGP 长短信发送问题小结

    长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...

  9. LeetCode 412. Fizz Buzz

    Problem: Write a program that outputs the string representation of numbers from 1 to n. But for mult ...

  10. 关于WM_GETTEXT的应用

    HWND hw = ::FindWindow(NULL,"Form1"); HWND hw2 = ::FindWindowEx(hw,NULL,NULL,NULL); int le ...