(一)關於反射
什麼是反射?
反射就是在執行時,動態獲取物件資訊的方法。比如:執行時獲得物件有哪些屬性,方法,委託等。
反射的作用?
能夠實現執行時,動態呼叫物件的方法,以及動態設定、獲取屬性值等。
反射的示例:
using system;
using system.reflection;
namespace cs_test
set
}private int sage;
public int sage
set
}} class test_attribute}}
(二)關於特性
什麼是 attribute?
它是對執行時的物件或物件的屬性、方法、委託等進行描述的類。
attribute 的作用?
用於在執行時,描述你的**或者影響你的程式的行為。
注意:既然attribute 是類,那麼它的定義與定義類一樣。
唯一不同的就是,自定義attribute 類必須繼承於system.attribute 空間。
特性的示例:
//描述資料庫欄位的 attribute
public class datafieldattribute : attribute
// 資料庫欄位名
private string _fieldname;
public string fieldname
set
}// 資料庫字段型別
private string _fieldtype;
public string fieldtype
set }}
通過自定義attribute,我們定義了類屬性和資料庫欄位的一一對應關係,於是對mystudent 類的name、age 屬性都加上attribute 的描述,指定他們對應的資料庫欄位名以及型別。
**更改如下:
public class mystudent
set
}private int _age;
[datafieldattribute("sage", "int")]
public int age
set }}
(三)orm 對映規則的定義
給實體類增加datafieldattribute 的描述,其實就是增加了o(物件)/ r(關係數程式設計客棧據庫)的對映規則。
下面我們就通過反射的方法實現:在執行時動態獲取o/r mapping 的對映規則:
static void main(string args)
}}顯示結果:
實體類的屬性名:name -> 資料庫欄位名:sname
實體類的屬性名:age -> 資料庫欄位名:sage
接下來的工作就是:怎樣根據這種方法動態地從物件中獲取對映規則,然後動態構造insert、update、delete 等 sql 語句。這就是實現自己的orm 的原理。
這裡的**僅僅是舉例,而要真正實現乙個orm,我們還需要考慮的很多,比如:
1、實體類對應於哪張資料庫表?
2、資料庫表中的 pk 和 fk(如果有的話)怎麼表示?
完整**如下:
using system;
using system.reflection;
namespace cs_test
set
}private int _age;
[datafieldattribute("sage", "int")]
public int age
set
}} //描述資料庫欄位的 attribute
public class datafieldattribute : attribute
// 資料庫欄位名
private string _fieldname;
public string fieldname
set
}// 資料庫字段型別
private string _fieldtype;
public string fieldtype
set
}} class test_attribute}}
}}本文標題: c#根據反射和特性實現orm對映例項分析
本文位址:
反射簡介 C 特性和反射
net編譯器的任務之一就是為所有定義和引用的型別生成元資料描述。除了程式集中標準的元資料外,net平台還支援特定 attribute 把更多的元資料嵌入到程式集中。net特性擴充套件了抽象的system.attribute基類,net中有很多預定義的特性,例如 dllimport obsolete ...
C 利用反射 特性實現簡單的實體對映資料庫操作類
附上源 1 using system 2using system.collections.generic 3using system.data 4using system.linq 5using system.text 6using system.threading.tasks 78 namespa...
C 實現的ORM對映工具類介紹 三
dbmanager類 class dbmanager include dbmanager.hpp dbmanager dbmanager pdbmanager null dbmanager dbmanager for int i 0 iclassnamevector.size j if pmodel...