麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

c#中利用委托反射將DataTable轉換為實體集的代碼

2020-01-24 03:41:05
字體:
來源:轉載
供稿:網友
類泛型的約束:
復制代碼 代碼如下:
public static class ToModel<T> where T : class, new()

定義委托:
復制代碼 代碼如下:
public delegate void SetString(string value);

創建委托方法:
復制代碼 代碼如下:

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轉換為實體集:
復制代碼 代碼如下:

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;
}

這樣寫問題就來了,因為委托定義的參數時string類型的,因為我們實體中可能有int或者DateTime類型的,這時就需要用上泛型委托了
如果這樣定義委托:
復制代碼 代碼如下:
public delegate void SetString<PT>(PT value)

創建委托方法(這里有問題,不知如何處理):
復制代碼 代碼如下:

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轉換為實體集:
復制代碼 代碼如下:

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;
}

一直疑惑著,希望有人幫我解決疑惑,直接反射的方法我也有,但是這個問題不解決,心里一直有疙瘩,希望有人幫幫忙,謝謝
泛型可以動態構建的,你了解了這個,就能解決了,附上我的簡略代碼:
復制代碼 代碼如下:

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();
//這里構造泛型委托類型
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);
//這里改變類型
setDelegate.DynamicInvoke(Convert.ChangeType(dr[dc.ColumnName], GetPropertyType(dc.ColumnName)));
}
list.Add(model);
}
return list;
}
}
}

謝謝,我剛修改了,我傳進去SqlDataReader和DataTable都可以轉換了,當時只想著每次返回一個特定類型等委托都不知道如何下手,看著你的方法解決了
沒想到DynamicInvoke這個方法,算是學習了,你的代碼寫著層次好清晰,看了是一種享受,向你學習啊!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 影视免费观看 | 国产影院一区 | 欧美 日韩 国产 成人 | 成人短视频在线观看免费 | 久久精品网 | 久久精品探花 | 久国久产久精永久网页 | 精品国产一区三区| 久久午夜神器 | 最近免费观看高清韩国日本大全 | 国产精品成aⅴ人片在线观看 | 免费观看欧美一级片 | 99国产精品欲a | 国产精品久久久久久久久岛 | 日本中文高清 | 黄色成人小视频 | 九色 在线 | 亚洲欧美日韩一区二区三区在线观看 | 欧美韩国日本在线 | 在线成人影视 | 久久久精品网 | 深夜福利视频免费观看 | 91短视频在线 | 一区二区三区日本在线观看 | 成人福利视频导航 | 黄色大片高清 | av在线免费观看不卡 | 中文字幕一区2区 | 操碰视频在线观看 | 久久2019中文字幕 | 日韩黄色精品 | 成人青青草 | 欧美成年人在线视频 | 精品成人在线观看 | 久久久久久久久久久av | 国产精品一区视频 | 久久99国产精品免费网站 | 牛牛碰在线 | 国产精品自拍99 | 欧美www| 九九热国产视频 |