/// <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. 如何在Eclipse下查看JDK源代码

    在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 "window"-> "Preferences" -> "Java&quo ...

  2. js,jq,css选择器

    js获取节点: var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; / ...

  3. ios 输入框bar设置

    _textView = [[class alloc] init];        _textView.translatesAutoresizingMaskIntoConstraints = NO;   ...

  4. 良心版Dolby Home Theater v4.1安装教程

    感(pi)谢(pan)一下两个教程: 文库文章链接:http://wenku.baidu.com/link?url=beBg_apvCuY3xiCXk4zl65Q7AmeCjoDGMol03K0xhk ...

  5. locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory

    # locate zabbix locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory locate ...

  6. [LeetCode] Best Time to Buy and Sell Stock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  7. Datazen笔记索引

      Datazen介绍 http://www.cnblogs.com/aspnetx/p/4557547.html   Datazen安装 http://www.cnblogs.com/aspnetx ...

  8. winform快速开发平台->让有限的资源创造无限的价值!

    最近一直在维护一套自己的快速开发平台. 主要应对针对C/S架构下的项目.然而对winform这快,还真没有看到过相对好的快速开发平台, 何为快速,在博客园逛了了好久, 预览了很多通用权限管理系统. 确 ...

  9. WCF 学习篇

    写在前面 自从运用了.NET Remoting 之后,就想系统的学习下WCF,因为WCF是对现有分布式通信技术的整合.主要以 <WCF全面解析> 这本书为主,园子的资料和网上资料为辅,来学 ...

  10. CVE-2010-3654分析及利用

    三年前分析的一个漏洞,最近又温习一遍,这个flash中混淆漏洞的鼻祖,10年最经典的漏洞. 漏洞触发原因 该漏洞主要因为avm对返回的类没有进行校验,通过修改swf文件,实现Ref类和Origin类的 ...