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 ...
随机推荐
- R语言 入门知识--常用操作和例子
1 R的下载.安转 (转)R有很多的版本,支持目前主流的操作系统MAC.Linux和WINDOWS系列.因为我个人是在WINDOWS下用R的,所以在这里将只介绍WINDOWS下R的下载&安 ...
- ubuntu系统怎么分区
首先科普下windows和linux的文件系统和主分区: 1.电脑的主分最多只有只能由四个.如果是win7和linux双系统,则windows系统可能会占到1-2个主分区,那linux最多只能有两个主 ...
- 如何安装ipa文件
ipa文件就相当于安卓手机的apkWindows的exe,就是一个程序,只不过ipa是苹果手机的安装包而已,一般苹果的应用程序都是从AppStore下载的,ipa一般用于测试App才会这样安装程序. ...
- Hitachi Content Platform学习
相关资料:https://community.hds.com/groups/developer-network-for-hitachi-content-platform/content?filterI ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- Win10 UI入门RelativePanel(2)
自适应 1) Gif: 添加动画 2)
- CozyRSS开发记录14-RSS源管理初步完工
CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...
- word使用笔记(1)
开始字母的格式也是宋体,只要全选后设置字体为Times New Roman即可,会自动跳过中文 新安的Mathtype字体有点奇怪,在样式里设置了一下,果然自定义为宋体了,改回Times New Ro ...
- Java 之 GUI
1.SWT: a.组成:①java.awt包:工具类--颜色.字体类等 ②javax.swing包:容器类 与 组件 (java.awt包中容器类与组件的升级版,以J打头) b.总结:SWT = Sw ...
- [原创]Centos7 从零配置Nginx+PHP+MySql
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...