乙個簡易的反射類庫NMSReflector

2021-07-25 16:35:33 字數 2964 閱讀 3287

以前看過一些**,是簡單的讀取sqlreader然後賦值給model,我不是不贊同這種做法,只是看到大篇幅的賦值操作真的有點浪費時間和精力,尤其是一些老專案居多。我看到的還好,多的也就60多個欄位且不用其他orm,如果涉及到變更的話,那麼對維護人員來說可能不僅僅是眼力活甚至還是....體力活。另外就是**的操作,因為鄙人之前也是寫過類似的專案,列名對應著model屬性名,乙個不差,隱隱覺得它們之間應該聯絡起來,所以想能不能盡可能簡化它的操作?可能是自己做得專案太少,只能想到反射這種方法,但是反射的效能大家也都了解,大量的反射賦值耗時可以慢到你眨幾下眼睛,但這對程式來說我覺得是一場災難。因此結合反射發出的方法寫了這個庫,如果能給大家在專案上帶來一些便利我也就知足了。[如今nuget上支援.net2.0到.net4.62,還有.netstandard 1.6]

public class student : inmsreflector         

public static string staticfield;

public static string staticproperty

}

step1 : 引用類庫. 

step2 : using nmsreflector.

step3 : 將你的類實現inmsreflector介面;(當然了,如果你嫌麻煩,可以改一下原始碼,在modeloperator.cs中).

step4 : 用create方法建立快取. (會掃瞄搜尋入口程式集的所有類)

由於類庫中對object型別做了擴充套件,因此物件例項可以呼叫擴充套件方法。

1、emitset(string propertyname,object value)  為物件的字段或屬性賦值

2、emitget(string propertyname) 獲取物件某欄位或者屬性值 

modeloperator.create();   

student t = new student();

//普通字段

t.name = "小明";

t.emitset("name", "小明胸前的紅領巾更加鮮豔了!");

console.writeline(t.name);

console.writeline(t.emitget("name"));

//普通屬性

t.emitset("description", "他愛著小剛");

console.writeline(t.description);

console.writeline(t.emitget("description"));

//靜態字段

t.emitset("staticfiled", "是他挨著小剛");

console.writeline(student.staticfield);

console.writeline(t.emitget("staticfield"));

//靜態屬性

t.emitset("staticproperty", "剛才打錯了");

支援column標籤

public class student : inmsreflector 

public static string staticfield;

public static string staticproperty

}

這裡的標籤是來自於system.componentmodel.dataannotations.schema; 

所以需要using system.componentmodel.dataannotations.schema;

無論傳標籤設定的名字還是屬性名,都可以賦值或者獲取值。

modeloperator.create(); 

student t = new student();

t.emitset("note", "設定標籤");

console.writeline(t.description);

console.writeline(t.emitget("note"));

modeloperator類提供了更多的操作函式。

與object的擴充套件方法有所不同,第乙個引數需要把例項傳進去

//獲取例項t的某字段和屬性的值

object get(t t, string propertyname)

//設定例項t的某字段和屬性的值

void set(t t, string propertyname, object value)

//獲取型別t的某字段和屬性的型別

type gettype(string propertyname)

//獲取型別t的設定方法快取

dictionary> getsetcache()

//獲取型別t的獲取方法快取

dictionary> getgetcache()

//獲取型別t的屬性字段型別快取

dictionarygettypecache()

//獲取型別t的標籤與屬性字段快取

乙個高效反射類

1.專案中有需要用到反射的地方,仔細研究了下反射,其效率並不高 還好微軟提供了il的程式設計方法,自己實現了乙個高效反射類 下面舉些常用例子 我們反射出.netframework中的乙個未公開的類 sessionstateutility 並呼叫其私有方法 deserialize 注意 由於dynam...

簡易的 乙個 Date類(日期類)

date 日期類 date類需要包括三個成員變數,年,月,日,注意年月日皆應該使用整形。對日期 類,需要判斷是否為閏年,因此決定2月的天數,並且要使用過載運算子相關的知識用來解決對日期類物件的輸入與輸出。bool operator const date d bool operator const d...

乙個String類的建簡易實現

其中比較重要的那幾個建構函式和析構函式 如果能夠把ostream的過載寫出來將會更加流弊 class string public string const char str null 建構函式 加分項 以下內容加const很重要 string const string other 拷貝構造 stri...