開源一個小類庫, 用於對象間靈活的拷貝屬性,還有IDataReader到實體類的轉換


功能一:

背景:

  編程中經常有這個需求,要在兩個非常類似的實體類中,拷貝同名屬性的值,(例如在WCF實體和EF實體中的拷貝...)

  以往一般有兩個方案

    1.硬編碼:執行效率很高,不過要寫很多重復的代碼,

    2.反射: 靈活,不過效率非常低

 

這里提供一個靈活性不比反射差的解決方案  https://github.com/xwj90/Clover.Copyer

使用代碼非常簡單,如下所示, 只有一句話

 //范例一  在兩個對象直接拷貝屬性
ClassA target = new ClassA();
ClassB source = new ClassB() { A = "AA", B = 2, C = DateTime.Now };

//復制代碼
CopyHelper<ClassB, ClassA>.Copy(source, target);//這一句是調用方法

Console.WriteLine(target.A);
Console.WriteLine(target.B);
Console.WriteLine(target.C);



兩個類型的定義如下:

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

備注:支持所有類型的公開實例屬性

  不支持索引器

 

 

功能二:

  從數據庫提供的IDataReader中讀取出對應的值,並轉換成相應類型賦值給實體類,

  省掉了中間的Dataset的過程,也節省了很多類型轉換和硬編碼的工作

  先看看代碼:

            //范例二  從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);//這一句是調用方法
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();
}
}
}

備注:支持所有基本類型,每次返回的列的順序要一樣,  不要一會兒select a,b from table  然后一會兒 select b,a from table (自動探測要消耗很多性能,以后再實現)

 

實現原理:
第一次的時候使用反射分析類型, 然后使用ILEmit 生成動態方法

將動態方法緩存下來,第二次的時候就可以直接使用該方法了

 

性能:

基本上在屬性比較多的類型中效率比例大約為  

硬編碼:動態方法:反射

1:5-10:100-1000  (實際測試的時候類中大約有 1-30個屬性)

 

 

 還請各位提點意見


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM