今天真好。保持微笑。真好,哈哈。
7月15日 星期三 天氣晴
昨天帶著遺憾離開了,因為泛型方法的動態呼叫的問題,還沒有得到很好的解決。今天一定要把它幹了!
10:18--------終於成功。馬上要寫一篇日誌,記錄反射技術的使用心得。
關於反射
反射是在執行時獲得類、方法等的資訊,並加以使用的一種技術。
看看我要做什麼吧:
linq中每乙個資料表對應乙個實體類,而表中的每一條記錄對應乙個實體類物件。
現在我首先要將這些資料表記錄從資料庫中讀出來,變成乙個個實體類物件,然後再把他們序列化,寫入到二進位制檔案中。
從資料庫讀記錄出來,用的是這樣一條語句: tabletable = database.gettable. database這個變數是乙個datacontext,等於是乙個資料庫的對映,table類是system.data.linq空間下的乙個類,是乙個實現了iemurable泛型介面的,可以用getemurator,得到乙個迭代器,即是tentity這個實體類的所有類物件的集合。(這些物件的集合其實就是資料記錄的集合了)
本來是很簡單的,問題是,如果有100個表,那難道我要寫100條上面的語句(tentity換成具體的實體類名)來獲得100個table嗎?這肯定是不可行的,所以唯一的解決方法就是動態呼叫泛型方法!
怎麼做呢?
利用反射技術就可以達到目的了。利用三點:一:type型別描述和記錄實體類資訊 二:反射技術對方法的動態呼叫 三:泛型方法的呼叫
首先,使用乙個容器類,當然可以是泛型容器了,裡面裝上所有實體類的型別type,比如這個容器是listtypelist;
typelist.add(typeof(sys_control));
typelist.add(typeof(sys_user));
將100個實體型別全部裝載進去,好的。
第二步,寫乙個方法,注意必須是公用方法,否則是動態呼叫不了的。因為找不到。
比如說,我現在要獲得每乙個實體類的類物件的個數。其實也就是每乙個資料表的記錄數了。
好的,那這個方法是
public static int gettablecount() where t:class{
tabletable = database.gettable();
return table.count();
好的,現在就來呼叫這個泛型方法:
type t = typelist[0];
methodinfo method = typeof(****class).getmethod(「gettablecount」);
methodinfo gmethod = method.makegenericmethod(t);
int result = (int)gmethod.invoke(null,null);
注意typeof裡面的是含有泛型方法的類名。這裡應該有乙個foreach來迭代這個容器的,就不寫了,看得明白就行。getmethod的引數是方法名,是字串型別的,用他來查詢這個方法,注意方法一定要是公共的才能找到。
用這樣的動態方法呼叫,感覺挺爽,但是除錯起來就比較麻煩,因為動態呼叫的方法中任何一條語句丟擲異常,vs都只會幫你定位到int result = (int)gmethod.invoke(null,null);這裡,所以要f11來找出拋異常那條語句。
ps:今天找bug的時候還發現乙個問題,就是不可以再外部沒有訂閱事件的情況下來激發乙個事件,不然就會拋異常~也就是說如果你激發乙個事件,你要保證一定要有乙個eventshandler來處理這個事件。
C 學習紀要 1 7月8日
注 暑假實習開始了。公司要的是c oh,yeah。來吧。c net,等你們好久了。哈哈。7月8日 星期三 天氣晴得不得了 今天已經是實習的第二天了。昨天懶得寫日誌,今天就開始補上吧。昨天做的事情包括 1.了解整個已開發系統的架構和模組。了解自己要做的模組的組成。2.初步完成資料庫連線配置窗體的設計和...
C 學習紀要 12 7月23日
7月23日 星期四 天氣晴 大暑啊。昨天下午偷懶了。什麼都沒寫就走人。主要因為昨天下午辛苦耕耘,終於將備份恢復嚮導模組的整體整合和測試工作做完了。今天早上花了乙個早上的時間將專案融合到團隊伺服器中,發現teamserver還挺難用的。終於弄完了,忙裡偷閒過來寫兩句,安排一下接下來的工作 首先,取消按...
7月9日 會議紀要
一.成員時間投入情況 侯松 暑假無其他專案 另加入了乙個團隊小組 範興鵬 7月10日 14日在北京,其餘時間ok 劉晗 一周3天實習,其餘時間ok 李蔚 每晚有2.5小時的時間投入 8月1日 11日除外 楊偲棟 7月可以投入80 以上的時間,8月投入50 的時間 餘欣緯 7月15日 31日修改 其餘...