C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼
游戲服務(wù)器里面總是有一大堆的配置文件需要讀取, 而且這些配置文件的讀取: * 要不然做成弱類型的, 就是一堆字符串或者數(shù)字, 不能看出來錯誤(需要重新檢測一次) * 要不然做成強(qiáng)類型的, 每種類型都需要自己Parse一下
我個人比較喜歡后者, 因?yàn)榍罢週oadConfig的代碼簡單, 但是寫邏輯的時候代碼不簡單.
class Config1 : public IConfig {
public void Fill(EntryLine& line);
int32_t param1;
string param2;
std::vector<int32_t> param3;
};
void Config1::Fill(EntryLine& line) {
this->param1 = line.ReadInt32();
this->param2 = line.ReadString();
this->param3 = line.ReadVectorInt32();
}
大概的填充函數(shù)就上上面寫的那樣, 只是ReadInt32這種函數(shù)是虛構(gòu)的, 需要你自己去實(shí)現(xiàn)(哼)
然后這種代碼寫起來很煩, 我不是很想寫. 這是本文產(chǎn)生的原因.
C#里面有XML反序列化, 我定義一個類:
class Config1 {
int32 param1;
string param2;
int[] param3;
}
XmlSerializer serializer = new XmlSerializer(typeof(Config1));
var obj = (Config1)serializer.Deserialize(stream);
這個反序列化就非常簡單, 我其實(shí)要的就是這個東西, 只是Xml反序列化用的是Node, 而我想用屬性, 另外一個就是屬性的值我有一些自己個性化的東西在里面.
感謝微軟提供了調(diào)試.NET Framework的功能, 讓我可以調(diào)試.NET源碼, 看看微軟是怎么實(shí)現(xiàn)的.
研究了一番發(fā)現(xiàn), 他居然是在XmlSerializer構(gòu)造的時候, 把Config1分析了一遍, 然后生成的一些元數(shù)據(jù), 和Read/Write方法, Deserialize只是調(diào)用了一下Read方法而已.
既然知道他是怎么實(shí)現(xiàn)的, 想必你研究一會兒, 也就能擼出來一個.
基本上你得先擼出來一個原型, 然后再把原型程序化.
PS: 暫時還沒有測試性能, 應(yīng)該不會太差, 最差就是服務(wù)器啟動的是慢幾秒.
XmlSerializationReaderILGen.cs
總結(jié)
以上所述是小編給大家介紹的C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:C#實(shí)現(xiàn)簡單的3DES加密解密功能示例
欄 目:C#教程
下一篇:C#連接到sql server2008數(shù)據(jù)庫的實(shí)例代碼
本文標(biāo)題:C#使用ILGenerator動態(tài)生成函數(shù)的簡單代碼
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5505.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動對資源的釋放
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10C#動態(tài)創(chuàng)建button的方法
- 01-10C#使用windows服務(wù)開啟應(yīng)用程序的方法
- 01-10c# ArrayList的使用方法小總結(jié)
- 01-10C#動態(tài)創(chuàng)建Access數(shù)據(jù)庫及密碼的方法
- 01-10C#使用ADO.Net部件來訪問Access數(shù)據(jù)庫的方法
- 01-10C#使用Mutex簡單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
- 01-10C#獲取動態(tài)生成的CheckBox值
- 01-10使用Nopcommerce為商城添加滿XX減XX優(yōu)惠券功能


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載


