開(kāi)源一個(gè)小類(lèi)庫(kù), 用于對(duì)象間靈活的拷貝屬性,還有IDataReader到實(shí)體類(lèi)的轉(zhuǎn)換
功能一:
背景:
編程中經(jīng)常有這個(gè)需求,要在兩個(gè)非常類(lèi)似的實(shí)體類(lèi)中,拷貝同名屬性的值,(例如在WCF實(shí)體和EF實(shí)體中的拷貝...)
以往一般有兩個(gè)方案
1.硬編碼:執(zhí)行效率很高,不過(guò)要寫(xiě)很多重復(fù)的代碼,
2.反射: 靈活,不過(guò)效率非常低
這里提供一個(gè)靈活性不比反射差的解決方案 https://github.com/xwj90/Clover.Copyer
使用代碼非常簡(jiǎn)單,如下所示, 只有一句話(huà)
//范例一 在兩個(gè)對(duì)象直接拷貝屬性
ClassA target = new ClassA();
ClassB source = new ClassB() { A = "AA", B = 2, C = DateTime.Now };
//復(fù)制代碼
CopyHelper<ClassB, ClassA>.Copy(source, target);//這一句是調(diào)用方法
Console.WriteLine(target.A);
Console.WriteLine(target.B);
Console.WriteLine(target.C);
兩個(gè)類(lèi)型的定義如下:
public sealed class ClassA
{
public string A { get; set; }
public int B { get; set; }
public string Title { get; set; }
public int Id { get; set; }
public DateTime C { get; set; }
}
public sealed class ClassB
{
public string A { get; set; }
public int B { get; set; }
public DateTime C { get; set; }
}
備注:支持所有類(lèi)型的公開(kāi)實(shí)例屬性
不支持索引器
功能二:
從數(shù)據(jù)庫(kù)提供的IDataReader中讀取出對(duì)應(yīng)的值,并轉(zhuǎn)換成相應(yīng)類(lèi)型賦值給實(shí)體類(lèi),
省掉了中間的Dataset的過(guò)程,也節(jié)省了很多類(lèi)型轉(zhuǎn)換和硬編碼的工作
先看看代碼:
//范例二 從IDataReader中讀取屬性
string connString = "Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;";
for (int i = 0; i < 1; i++)
{
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandText = "select top 1000 * from cLog";
conn.Open();
IDataReader reader = command.ExecuteReader();
var list = CopyHelper<TestClassA>.Copy(reader);//這一句是調(diào)用方法
foreach (var item in list)
{
Console.Write(item.LogId + "---");
Console.Write(item.LogTime + "---");
Console.Write(item.AppName + "---");
Console.Write(item.Server + "---");
Console.Write(item.IPAddress + " ");
Console.WriteLine();
}
}
}
備注:支持所有基本類(lèi)型,每次返回的列的順序要一樣, 不要一會(huì)兒select a,b from table 然后一會(huì)兒 select b,a from table (自動(dòng)探測(cè)要消耗很多性能,以后再實(shí)現(xiàn))
實(shí)現(xiàn)原理:
第一次的時(shí)候使用反射分析類(lèi)型, 然后使用ILEmit 生成動(dòng)態(tài)方法
將動(dòng)態(tài)方法緩存下來(lái),第二次的時(shí)候就可以直接使用該方法了
性能:
基本上在屬性比較多的類(lèi)型中效率比例大約為
硬編碼:動(dòng)態(tài)方法:反射
1:5-10:100-1000 (實(shí)際測(cè)試的時(shí)候類(lèi)中大約有 1-30個(gè)屬性)
還請(qǐng)各位提點(diǎn)意見(jiàn)
posted on 2012-03-10 13:24 聽(tīng)說(shuō)讀寫(xiě) 閱讀(2844) 評(píng)論(5) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)