DataTable扩展方法ToList<T>()、ToJSON()、ToArrayList()
/// <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()的更多相关文章
- C# DataTable扩展方法
在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...
- C#中DataTable与实体集合通用转换(使用扩展方法)
本案例提供了:把DataRow转换为单个实体.dataTable转换为List泛型支持时间格式转换. 下文的方法都是扩展方法.扩展方法要求写在静态类中,方法也要静态. 它必须在一个非嵌套.非泛型的静态 ...
- 【转】给DataTable和DataRow扩展方法,直接转换为对象集合或对象
/// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为对象集合或对象 /// 补充说明:此扩展类可以极大的简化操作,但是性能低下,大数据以 ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- C#扩展方法 DataTable.ToEntitys
类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加功能到类A中去,怎么办? 这个时候扩展方法(Extension ...
- (原创)[C#] DataTable排序扩展方法
一,前言 DataTable的应用极其广泛,对DataTable进行排序也有很多方式,每种的实现方式都不难,但是使用起来却比较繁琐,所以本人便写了一个扩展方法,专门对DataTable进行操作. 本篇 ...
- C# 用this修饰符为原始类型扩展方法
特点:1.静态类 2.静态方法 3.第一个参数前加this 例如:public static List<T> ToList<T>(this string Json),就是为th ...
- Farseer.net轻量级开源框架 中级篇:常用的扩展方法
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
随机推荐
- Lintcode 166. 主元素
----------------------------------- Moore's voting algorithm算法:从一个集合中找出出现次数半数以上的元素,每次从集合中去掉一对不同的数,当剩 ...
- 第六课 touch事件
1.移动端页面在PC上浏览时,限制宽度的方法: 2.移动端页面切换设备时自动刷新页面的方法: 3.touch事件 touchstart:当手指触摸屏幕时触发.通过addEventListener添加移 ...
- NOPI读取模板导出(Excel中追加数据)
在Controller里,我们定义一个FileResult的Action,返回值是一个文件形式被浏览器下载下来. [HttpGet] public FileResult ExportProductLi ...
- CSS--实现小三角形
<style> html, body { margin: 0; padding: 0; } /*下面用CSS3分别实现向上.下.左.右的三角形*/ .btn-color{ color: # ...
- python关于分割与拼接的那些事
1.split分割 基于re模块和正则表达式对象的方法split(),以后再做学习 基于字符串的split()方法 :字符串对象的split()方法也只能处理非常简单的情况,而且不支持多个分隔符,对分 ...
- CozyRSS开发记录20-CanResizeWithGrip
CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...
- android_studio上传svn的时候那些不提交
buid文件夹不需要提交
- z-stack协议uart分析(DMA)
1.从ZMain里面的main函数开始分析 2.进入int main( void ); HalDriverInit(); //硬件相关初始化,有DMA初始化和UART初始化 3.进入HalDriv ...
- ListFragment源码 (待分析)
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- Day 2 T1
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...