C# DataTable,DataSet,IList,IEnumerable 互转扩展属性

  • A+
所属分类:C#

C# DataTable,DataSet,IList,IEnumerable 互转扩展属性 - 可心专栏 - CSDN博客

C# DataTable,DataSet,IList,IEnumerable 互转扩展属性

using System;

using System.Collections.Generic;

using System.Data;

using System.Linq;

using System.Reflection;

using System.Collections;

namespace XHSoft.LicenseManagerUI

{

///

/// 扩展属性

///

public static class Extensions

{

region 数据集转换泛型集合扩展

///

/// DataSet转换为泛型集合

///

/// 泛型类型

///DataSet数据集

///待转换数据表索引,默认第0张表

/// 返回泛型集合

public static IList ToList(this DataSet ds, int tableIndex = 0)

{

if (ds == null || ds.Tables.Count < 0) return null;

if (tableIndex > ds.Tables.Count - 1)

return null;

if (tableIndex < 0)

tableIndex = 0;

DataTable dt = ds.Tables[tableIndex];

// 返回值初始化

IList result = new List();

for (int j = 0; j < dt.Rows.Count; j++)

{

T _t = (T)Activator.CreateInstance(typeof(T));

PropertyInfo[] propertys = _t.GetType().GetProperties();

foreach (PropertyInfo pi in propertys)

{

for (int i = 0; i < dt.Columns.Count; i++)

{

// 属性与字段名称一致的进行赋值

if (pi.Name.Equals(dt.Columns[i].ColumnName))

{

// 数据库NULL值单独处理

if (dt.Rows[j][i] != DBNull.Value)

pi.SetValue(_t, dt.Rows[j][i], null);

else

pi.SetValue(_t, null, null);

break;

}

}

}

result.Add(_t);

}

return result;

}

///

/// DataTable转换为泛型集合

///

/// 泛型类型

///DataTable数据表

/// 返回泛型集合

public static IList ToList(this DataTable dt) where T:class,new()

{

if (dt == null || dt.Rows.Count <= 0) return null;

List list =new List();

region 方法一:

//T model;

//Type infos = typeof(T);

////object tempValue;

//foreach (DataRow dr in dt.Rows)

//{

// model = new T();

// 1.

// infos.GetProperties().ToList().ForEach(p =>p.SetValue(model, dr[p.Name], null));

// 2.

// //infos.GetProperties().ToList().ForEach(p =>

// //{

// // tempValue = dr[p.Name];

// // if (!string.IsNullOrEmpty(tempValue.ToString()))

// // p.SetValue(model, tempValue, null);

// //});

// list.Add(model);

//}

endregion

region 方法二: 比方法一快

PropertyInfo[] propertys = typeof(T).GetProperties();

for (int j = 0; j < dt.Rows.Count; j++)

{

T _t = (T)Activator.CreateInstance(typeof(T));

foreach (PropertyInfo pi in propertys)

{

// 属性与字段名称一致的进行赋值

if (pi.Name.Equals(dt.Columns[pi.Name].ColumnName))

{

if (dt.Rows[j][pi.Name] != DBNull.Value)

pi.SetValue(_t, dt.Rows[j][pi.Name], null);

else

pi.SetValue(_t, null, null);

}

}

list.Add(_t);

}

endregion

return list;

}

///

/// DataSet转换为泛型集合

///

/// 泛型类型

///DataSet数据集

///待转换数据表名称,名称为空时默认第0张表

/// 返回泛型集合

public static IList ToList(this DataSet ds, string tableName)

{

int _TableIndex = 0;

if (ds == null || ds.Tables.Count < 0)

return null;

if (string.IsNullOrEmpty(tableName))

return ToList(ds, 0);

for (int i = 0; i < ds.Tables.Count; i++)

{

// 获取Table名称在Tables集合中的索引值

if (ds.Tables[i].TableName.Equals(tableName))

{

_TableIndex = i;

break;

}

}

return ToList(ds, _TableIndex);

}

endregion

region 泛型集合转换为数据集扩展

///

/// 将泛型集合转换成DataSet数据集

///

/// T类型

///泛型集合

/// DataSet数据集

public static DataSet ToDataSet(this IList list)

{

Type elementType = typeof(T);

var ds = new DataSet();

var t = new DataTable();

ds.Tables.Add(t);

elementType.GetProperties().ToList().ForEach(propInfo => t.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));

foreach (T item in list)

{

var row = t.NewRow();

elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);

t.Rows.Add(row);

}

return ds;

}

///

/// 泛型集合转换成DataTable表

///

/// T类型

///泛型集合

/// DataTable表

public static DataTable ToDataTable(this IList list)

{

return ToDataTable(list, null);

}

///

/// 泛型集合转换成DataTable表

///

/// T类型

///泛型集合

///Table名称

/// DataTable表

public static DataTable ToDataTable(this IList list, string _tableName)

{

Type elementType = typeof(T);

var dt = new DataTable();

if (_tableName == "null")

dt.TableName = _tableName;

elementType.GetProperties().ToList().ForEach(propInfo => dt.Columns.Add(propInfo.Name, Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType));

foreach (T item in list)

{

var row = dt.NewRow();

elementType.GetProperties().ToList().ForEach(propInfo => row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value);

dt.Rows.Add(row);

}

return dt;

}

endregion

region 以下为IEnumerable扩展实现

///

/// 给非强类型的IEnumerable返回头一个元素。

///

public static object First(this IEnumerable col)

{

foreach (var item in col)

return item;

throw new IndexOutOfRangeException();

}

///

/// 给非强类型的IEnumerable返回头一个强类型的元素

///

public static object First(this IEnumerable col)

{

return (T)col.First();

}

///

/// 基本上和List的ForEach方法一致。

///

public static void Each(this IEnumerable col, Action handler)

{

foreach (var item in col)

handler(item);

}

///

/// 带索引的遍历方法。

///

public static void Each(this IEnumerable col, Action handler)

{

int index = 0;

foreach (var item in col)

handler(item, index++);

}

///

/// 可以半途中断执行的遍历方法。

///

public static void Each(this IEnumerable col, Func handler)

{

foreach (var item in col)

if (!handler(item)) break;

}

///

/// 可以半途中段的带索引的遍历方法。

///

public static void Each(this IEnumerable col, Func handler)

{

int index = 0;

foreach (var item in col)

if (!handler(item, index++)) break;

}

endregion

region 以下为IEnumerable的非泛型实现

public static void Each(this IEnumerable col, Action handler)

{

foreach (var item in col)

handler(item);

}

public static void Each(this IEnumerable col, Action handler)

{

int index = 0;

foreach (var item in col)

handler(item, index++);

}

public static void Each(this IEnumerable col, Func handler)

{

foreach (var item in col)

if (!handler(item)) break;

}

public static void Each(this IEnumerable col, Func handler)

{

int index = 0;

foreach (var item in col)

if (!handler(item, index++)) break;

}

endregion

}

}​

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
Copyright ©  站点名称  版权所有. Begin主题
  • 文章目录
  • icon