C#使用ILGenerator动态生成函数
游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需要自己Parse一下
我个人比较喜欢后者, 因为前者LoadConfig的代码简单, 但是写逻辑的时候代码不简单.
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();
}
大概的填充函数就上上面写的那样, 只是ReadInt32这种函数是虚构的, 需要你自己去实现(哼)
然后这种代码写起来很烦, 我不是很想写. 这是本文产生的原因.
C#里面有XML反序列化, 我定义一个类:
class Config1 {
int32 param1;
string param2;
int[] param3;
}
XmlSerializer serializer = new XmlSerializer(typeof(Config1));
var obj = (Config1)serializer.Deserialize(stream);
这个反序列化就非常简单, 我其实要的就是这个东西, 只是Xml反序列化用的是Node, 而我想用属性, 另外一个就是属性的值我有一些自己个性化的东西在里面.
感谢微软提供了调试.NET Framework的功能, 让我可以调试.NET源码, 看看微软是怎么实现的.
研究了一番发现, 他居然是在XmlSerializer构造的时候, 把Config1分析了一遍, 然后生成的一些元数据, 和Read/Write方法, Deserialize只是调用了一下Read方法而已.
既然知道他是怎么实现的, 想必你研究一会儿, 也就能撸出来一个.
基本上你得先撸出来一个原型, 然后再把原型程序化.
PS: 暂时还没有测试性能, 应该不会太差, 最差就是服务器启动的是慢几秒.
XmlSerializationReaderILGen.cs
C#使用ILGenerator动态生成函数的更多相关文章
- 你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是 ...
- Qt写Activex插件 总结
最近写的插件功能基本完成,也遇到了一些坑,在这里记录一下. 我写的这个插件的js接口是仿造google earth的js接口,尽可能的达到与它的api一致.先从最简单的说起: 1. 导出接口中的flo ...
- Mini ORM——PetaPoco笔记
Mini ORM--PetaPoco笔记 记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoc ...
- Mini ORM——PetaPoco笔记(转)
记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoco-Improvements PetaPo ...
- Clojure上手
Clojure,这是什么鬼?一门基于JVM(现在也有基于.NET CLR的了:Clojure CLR) 的函数式编程语言.在JVM平台运行的时候,会被编译为JVM的字节码进行运算..为什么要学它?其设 ...
- JavaScript学习总结(二)
JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...
- JavaScript学习总结 之对象
JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
- 你不知道的JS之作用域和闭包(二)词法作用域
原文:你不知道的js系列 词法作用域(Lexical Scope) Lex time 一个标准的编译器的第一个阶段就是分词(token化) 词法作用域就是在词法分析时定义的作用域.换句话说,词法作用域 ...
随机推荐
- Python自定义异常及抛出异常
""" 自定义异常 """ class MyException(Exception): # 继承异常类 def __init__(self, ...
- Spark应用【根据新df更新旧df】
// 主键字段保持不变,再转换回来 var columnMap:Map[String, String] = Map() for(key <- keysOpt){ columnMap += (ke ...
- spring4笔记----依赖注入的两种形式
设值注入:通过<property.../>元素驱动Spring执行setter的方法 构造注入:通过<constructor-arg.../>元素驱动Spring执行带有参数的 ...
- django数据查询之F查询和Q查询
仅仅靠单一的关键字参数查询已经很难满足查询要求.此时Django为我们提供了F和Q查询: # F 使用查询条件的值,专门取对象中某列值的操作 # from django.db.models impor ...
- 关于java中assert(断言)的使用讲解
说明:写的不是很全面,有任何问题请留言,多交流,谢谢! 1.eclipse.myeclipse开启assert(断言),默认是关闭,如下: 说白了就是设置一下jvm的参数,参数是-ea或者-enabl ...
- nmap脚本使用总结
0x00 前言: nmap的基本介绍和基本使用方法,在乌云知识库中已经有人提交过,讲的比较详细,在此文中就不再讲述. 具体链接:http://drops.wooyun.org/tips/2002 本文 ...
- spark on yarn模式:yarn命令杀除当前的application
在hadoop/bin目录下有yarn命令 yarn application -kill <applicationId>
- focus()无效问题
我想点击弹出一个控件的时候控件里的input自动获取焦点,INPUT的class为"group-input",可用下面的写法不行: document.queryselect(&qu ...
- UVA1605-Building for UN(思维)
Problem UVA1605-Building for UN Accept: 398 Submit: 2303Time Limit: 10000 mSec Problem Description ...
- [matlab] 15.罚函数降维
求非线性规划 min f(x)= x(1)^2 + x(2)^2 + 8 s.t. { x(1)^2-x(2)>=0 , -x(1) - x(2)^2 +2 = 0, x(1)>=0 ,x ...