c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼
更新時(shí)間:2012年10月11日 01:05:14 作者:
c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼,需要的朋友可以參考下
類(lèi)泛型的約束:
定義委托:
創(chuàng)建委托方法:
private static SetString CreateStringDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
Type type = typeof(SetString);
return Delegate.CreateDelegate(type, model, mi) as SetString;
}
利用反射和委托將DataTable轉(zhuǎn)換為實(shí)體集:
public static IList<T> GetDelegate_ToModelList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
SetString setDelegateString;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
setDelegateString = CreateStringDelegate(model, dc.ColumnName);
setDelegateString(dr[dc.ColumnName].ToString());
}
list.Add(model);
}
return list;
}
這樣寫(xiě)問(wèn)題就來(lái)了,因?yàn)槲卸x的參數(shù)時(shí)string類(lèi)型的,因?yàn)槲覀儗?shí)體中可能有int或者DateTime類(lèi)型的,這時(shí)就需要用上泛型委托了
如果這樣定義委托:
創(chuàng)建委托方法(這里有問(wèn)題,不知如何處理):
private static SetString CreateStringDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
Type type = typeof(model).GetProperty(propertyName).PropertyType;
return Delegate.CreateDelegate(type, model, mi) as SetString<type>;
}
利用反射和委托將DataTable轉(zhuǎn)換為實(shí)體集:
public static IList<T> GetDelegate_ToModelList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName);
setDelegateString(dr[dc.ColumnName].ToString());
}
list.Add(model);
}
return list;
}
一直疑惑著,希望有人幫我解決疑惑,直接反射的方法我也有,但是這個(gè)問(wèn)題不解決,心里一直有疙瘩,希望有人幫幫忙,謝謝
泛型可以動(dòng)態(tài)構(gòu)建的,你了解了這個(gè),就能解決了,附上我的簡(jiǎn)略代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
namespace RftToModel {
class Program {
static void Main(string[] args) {
var result = ToModel<TestModel>.GetDelegate_ToModelList(BuildSampleTable());
foreach (var item in result) {
Console.WriteLine(item);
}
Console.Read();
}
static DataTable BuildSampleTable() {
DataTable result = new DataTable();
result.Columns.Add("ID", typeof(int));
result.Columns.Add("Name", typeof(string));
result.Columns.Add("IsDeleted", typeof(bool));
result.Rows.Add(new object[] { 1, "M.K", false });
result.Rows.Add(new object[] { 2, "B.G", true });
return result;
}
}
public class TestModel {
public int ID { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; }
public override string ToString() {
return string.Format("ID:{0} Name:{1} IsDeleted:{2}", ID, Name, IsDeleted);
}
}
public delegate void SetValue<T>(T value);
public static class ToModel<T> where T : class, new() {
private static Delegate CreateSetDelegate(T model, string propertyName) {
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
//這里構(gòu)造泛型委托類(lèi)型
Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
return Delegate.CreateDelegate(delType, model, mi);
}
private static Type GetPropertyType(string propertyName) {
return typeof(T).GetProperty(propertyName).PropertyType;
}
public static IList<T> GetDelegate_ToModelList(DataTable dt) {
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
Delegate setDelegate;
foreach (DataRow dr in dt.Rows) {
T model = new T();
foreach (DataColumn dc in dt.Columns) {
setDelegate = CreateSetDelegate(model, dc.ColumnName);
//這里改變類(lèi)型
setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], GetPropertyType(dc.ColumnName)));
}
list.Add(model);
}
return list;
}
}
}
謝謝,我剛修改了,我傳進(jìn)去SqlDataReader和DataTable都可以轉(zhuǎn)換了,當(dāng)時(shí)只想著每次返回一個(gè)特定類(lèi)型等委托都不知道如何下手,看著你的方法解決了
沒(méi)想到DynamicInvoke這個(gè)方法,算是學(xué)習(xí)了,你的代碼寫(xiě)著層次好清晰,看了是一種享受,向你學(xué)習(xí)??!
復(fù)制代碼 代碼如下:
public static class ToModel<T> where T : class, new()
定義委托:
復(fù)制代碼 代碼如下:
public delegate void SetString(string value);
創(chuàng)建委托方法:
復(fù)制代碼 代碼如下:
private static SetString CreateStringDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
Type type = typeof(SetString);
return Delegate.CreateDelegate(type, model, mi) as SetString;
}
利用反射和委托將DataTable轉(zhuǎn)換為實(shí)體集:
復(fù)制代碼 代碼如下:
public static IList<T> GetDelegate_ToModelList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
SetString setDelegateString;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
setDelegateString = CreateStringDelegate(model, dc.ColumnName);
setDelegateString(dr[dc.ColumnName].ToString());
}
list.Add(model);
}
return list;
}
這樣寫(xiě)問(wèn)題就來(lái)了,因?yàn)槲卸x的參數(shù)時(shí)string類(lèi)型的,因?yàn)槲覀儗?shí)體中可能有int或者DateTime類(lèi)型的,這時(shí)就需要用上泛型委托了
如果這樣定義委托:
復(fù)制代碼 代碼如下:
public delegate void SetString<PT>(PT value)
創(chuàng)建委托方法(這里有問(wèn)題,不知如何處理):
復(fù)制代碼 代碼如下:
private static SetString CreateStringDelegate(T model, string propertyName)
{
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
Type type = typeof(model).GetProperty(propertyName).PropertyType;
return Delegate.CreateDelegate(type, model, mi) as SetString<type>;
}
利用反射和委托將DataTable轉(zhuǎn)換為實(shí)體集:
復(fù)制代碼 代碼如下:
public static IList<T> GetDelegate_ToModelList(DataTable dt)
{
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
foreach (DataRow dr in dt.Rows)
{
T model = new T();
foreach (DataColumn dc in dt.Columns)
{
SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName);
setDelegateString(dr[dc.ColumnName].ToString());
}
list.Add(model);
}
return list;
}
一直疑惑著,希望有人幫我解決疑惑,直接反射的方法我也有,但是這個(gè)問(wèn)題不解決,心里一直有疙瘩,希望有人幫幫忙,謝謝
泛型可以動(dòng)態(tài)構(gòu)建的,你了解了這個(gè),就能解決了,附上我的簡(jiǎn)略代碼:
復(fù)制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
namespace RftToModel {
class Program {
static void Main(string[] args) {
var result = ToModel<TestModel>.GetDelegate_ToModelList(BuildSampleTable());
foreach (var item in result) {
Console.WriteLine(item);
}
Console.Read();
}
static DataTable BuildSampleTable() {
DataTable result = new DataTable();
result.Columns.Add("ID", typeof(int));
result.Columns.Add("Name", typeof(string));
result.Columns.Add("IsDeleted", typeof(bool));
result.Rows.Add(new object[] { 1, "M.K", false });
result.Rows.Add(new object[] { 2, "B.G", true });
return result;
}
}
public class TestModel {
public int ID { get; set; }
public string Name { get; set; }
public bool IsDeleted { get; set; }
public override string ToString() {
return string.Format("ID:{0} Name:{1} IsDeleted:{2}", ID, Name, IsDeleted);
}
}
public delegate void SetValue<T>(T value);
public static class ToModel<T> where T : class, new() {
private static Delegate CreateSetDelegate(T model, string propertyName) {
MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();
//這里構(gòu)造泛型委托類(lèi)型
Type delType = typeof(SetValue<>).MakeGenericType(GetPropertyType(propertyName));
return Delegate.CreateDelegate(delType, model, mi);
}
private static Type GetPropertyType(string propertyName) {
return typeof(T).GetProperty(propertyName).PropertyType;
}
public static IList<T> GetDelegate_ToModelList(DataTable dt) {
IList<T> list = new List<T>();
if (dt == null || dt.Rows.Count < 1) return list;
Delegate setDelegate;
foreach (DataRow dr in dt.Rows) {
T model = new T();
foreach (DataColumn dc in dt.Columns) {
setDelegate = CreateSetDelegate(model, dc.ColumnName);
//這里改變類(lèi)型
setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], GetPropertyType(dc.ColumnName)));
}
list.Add(model);
}
return list;
}
}
}
謝謝,我剛修改了,我傳進(jìn)去SqlDataReader和DataTable都可以轉(zhuǎn)換了,當(dāng)時(shí)只想著每次返回一個(gè)特定類(lèi)型等委托都不知道如何下手,看著你的方法解決了
沒(méi)想到DynamicInvoke這個(gè)方法,算是學(xué)習(xí)了,你的代碼寫(xiě)著層次好清晰,看了是一種享受,向你學(xué)習(xí)??!
您可能感興趣的文章:
- C#中DataTable實(shí)現(xiàn)行列轉(zhuǎn)換的方法
- C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法
- C#將DataTable轉(zhuǎn)換成list的方法
- C#中的DataSet、string、DataTable、對(duì)象轉(zhuǎn)換成Json的實(shí)現(xiàn)代碼
- C#中把Datatable轉(zhuǎn)換為Json的5個(gè)代碼實(shí)例
- c#將list類(lèi)型轉(zhuǎn)換成DataTable方法示例
- c# DataTable與不同結(jié)構(gòu)實(shí)體類(lèi)轉(zhuǎn)換的方法實(shí)例
- C# DataTable 轉(zhuǎn)換為 實(shí)體類(lèi)對(duì)象實(shí)例
- C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼
- C#實(shí)現(xiàn)DataTable轉(zhuǎn)換成IList的方法
相關(guān)文章
Unity 實(shí)現(xiàn)給物體動(dòng)態(tài)添加事件
這篇文章主要介紹了Unity 實(shí)現(xiàn)給物體動(dòng)態(tài)添加事件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04C#具名參數(shù)(Named Parameters)的使用
在C#中,具名參數(shù)是一種在方法調(diào)用中使用參數(shù)名稱(chēng)來(lái)指定參數(shù)值的技術(shù),本文主要介紹了C#具名參數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的解決方法
本篇文章是對(duì)使用C# Winform應(yīng)用程序獲取網(wǎng)頁(yè)源文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# 正則判斷一個(gè)數(shù)字的格式是否有逗號(hào)的代碼
c#正則判斷一個(gè)格式化數(shù)字里是否有逗號(hào)的解決方法2008-07-07C#中圖片旋轉(zhuǎn)和翻轉(zhuǎn)(RotateFlipType)用法分析
這篇文章主要介紹了C#中圖片旋轉(zhuǎn)和翻轉(zhuǎn)(RotateFlipType)用法,實(shí)例分析了C#圖片旋轉(zhuǎn)及翻轉(zhuǎn)Image.RotateFlip方法屬性的常用設(shè)置技巧,需要的朋友可以參考下2015-06-06C#從文件或標(biāo)準(zhǔn)輸入設(shè)備讀取指定行的方法
這篇文章主要介紹了C#從文件或標(biāo)準(zhǔn)輸入設(shè)備讀取指定行的方法,涉及C#文件及IO操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04Asp.Net(C#)使用oleDbConnection 連接Excel的方法
ADO.NET采用不同的Connection對(duì)象連接數(shù)據(jù)庫(kù)。這篇文章主要介紹了Asp.Net(C#)使用oleDbConnection 連接Excel的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11