(精華)2020年6月26日 C#類庫 DataTable(擴充套件方法)
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Text;
namespace Core.Util
{
public static partial class Extention
{
/// <summary>
/// DataTable轉List
/// </summary>
/// <typeparam name="T">轉換型別</typeparam>
/// <param name="dt">資料來源</param>
/// <returns></returns>
public static List<T> ToList<T>(this DataTable dt)
{
List<T> list = new List<T>();
//確認引數有效,若無效則返回Null
if (dt == null)
return list;
else if (dt.Rows.Count == 0)
return list;
Dictionary<string, string> dicField = new Dictionary<string, string>();
Dictionary<string, string> dicProperty = new Dictionary<string, string>();
Type type = typeof(T);
//建立欄位字典,方便查詢欄位名
type.GetFields().ForEach(aFiled =>
{
dicField.Add(aFiled.Name.ToLower(), aFiled.Name);
});
//建立屬性字典,方便查詢屬性名
type.GetProperties().ForEach(aProperty =>
{
dicProperty.Add(aProperty.Name.ToLower(), aProperty.Name);
});
for (int i = 0; i < dt.Rows.Count; i++)
{
//建立泛型物件
T _t = Activator.CreateInstance<T>();
for (int j = 0; j < dt.Columns.Count; j++)
{
string memberKey = dt.Columns[j].ColumnName.ToLower();
//欄位賦值
if (dicField.ContainsKey(memberKey))
{
FieldInfo theField = type.GetField(dicField[memberKey]);
var dbValue = dt.Rows[i][j];
if (dbValue.GetType() == typeof(DBNull))
dbValue = null;
if (dbValue != null)
{
Type memberType = theField.FieldType;
dbValue = dbValue.ChangeType_ByConvert(memberType);
}
theField.SetValue(_t, dbValue);
}
//屬性賦值
if (dicProperty.ContainsKey(memberKey))
{
PropertyInfo theProperty = type.GetProperty(dicProperty[memberKey]);
var dbValue = dt.Rows[i][j];
if (dbValue.GetType() == typeof(DBNull))
dbValue = null;
if (dbValue != null)
{
Type memberType = theProperty.PropertyType;
dbValue = dbValue.ChangeType_ByConvert(memberType);
}
theProperty.SetValue(_t, dbValue);
}
}
list.Add(_t);
}
return list;
}
/// <summary>
///將DataTable轉換為標準的CSV字串
/// </summary>
/// <param name="dt">資料表</param>
/// <returns>返回標準的CSV</returns>
public static string ToCsvStr(this DataTable dt)
{
//以半形逗號(即,)作分隔符,列為空也要表達其存在。
//列內容如存在半形逗號(即,)則用半形引號(即"")將該欄位值包含起來。
//列內容如存在半形引號(即")則應替換成半形雙引號("")轉義,並用半形引號(即"")將該欄位值包含起來。
StringBuilder sb = new StringBuilder();
DataColumn colum;
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
colum = dt.Columns[i];
if (i != 0) sb.Append(",");
if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
{
sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
}
else sb.Append(row[colum].ToString());
}
sb.AppendLine();
}
return sb.ToString();
}
}
}
相關文章
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件
- C#中的擴充套件類的理解C#套件
- C# 反射呼叫擴充類方法C#反射
- C#開源實用的工具類庫,整合超過1000多種擴充套件方法C#套件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- 分類擴充套件套件
- HttpContext擴充套件類HTTPContext套件
- c# 高階應用 理解擴充套件方法C#套件
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- .NET: 談談C#中的擴充套件方法C#套件
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- Spring(11) - Introductions進行類擴充套件方法Spring套件
- Json擴充套件方法JSON套件
- LINQ擴充套件方法套件
- ASP.NET Core擴充套件庫之Http通用擴充套件ASP.NET套件HTTP
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- android view 擴充套件方法AndroidView套件
- 【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法C#隨機套件
- c# ExpandoObject動態擴充套件物件C#Object套件物件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- C 擴充套件庫 – mysql API套件MySqlAPI
- 使用cython擴充套件python庫套件Python
- DLR 的擴充套件庫 Dynamitey套件MIT
- (精華)2020年8月11日 C#基礎知識點 表示式目錄樹擴充套件(And,Or,Not)C#套件
- 再學Blazor——擴充套件方法Blazor套件
- weex ios擴充套件類的作用iOS套件
- Java-IoUtil擴充套件工具類Java套件
- 開源 - Ideal庫 - 常用列舉擴充套件方法(一)Idea套件
- 開源 - Ideal庫 - 特殊時間擴充套件方法(三)Idea套件
- 開源 - Ideal庫 - 常用列舉擴充套件方法(二)Idea套件
- Thinkphp5.0支付寶支付擴充套件庫類庫大全PHP套件
- (精華)2020年7月3日 JavaScript高階篇 ES6(物件的擴充套件方法)JavaScript物件套件
- LoggerOne – 高效、簡約、強擴充套件性PHP日誌類庫套件PHP
- .Net core Worker Service 擴充套件庫套件
- (精華)2020年7月3日 JavaScript高階篇 ES6(陣列的擴充套件方法)JavaScript陣列套件
- SpringBoot各類擴充套件點詳解Spring Boot套件
- 五個檢視擴充套件類 LL套件
- PowerToys外掛擴充套件(類似Alfred)套件Alfred