前不久在做脚本引擎的时候遇到这样一个要求:
脚本调用脚本引擎中的一个方法,调用的方法名称在脚本中指定,出于可扩展性考虑,第3方可以通过加入新的插件来增加脚本能够调用的方法。
1. 脚本只会给出要调用的方法名称,而这个不是在编译期确定的,所以需要根据名称使用反射查找方法,这很简单。
2. 脚本向方法传递参数都是JSON数据类型,也就是说,需要根据调用方法的参数类型将脚本传递过来的JSON数据类型转换为C#数据类型,可以是基本类型,也可以是结构体或类等复合类型。
难题就在第2点,JavaScriptSerializer类中有如下方法反序列化一个JSON字符串。
但它的泛形参数不能在编译期确定,因为参数类型可以是无限扩充的。所以必须通过反射查找到要调用的方法后,再根据要调用方法的参数类型来反序列化。
实现原理如下:
1. 脚本传递要调用的函数名称以及参数(JSON字符串格式)到脚本引擎
2. 脚本引擎根据函数名称查找到要调用的函数信息
3. 脚本引擎使用反射动态生成对JavaScriptSerializer.
Deserialize<T>的调用,而其中的T由第2步的反射给出
4. 调用。
示例代码如下:
分享到:
相关推荐
“反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。 1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = ...
C#,利用反射动态创建对象 C#,利用反射动态创建对象 C#,利用反射动态创建对象 C#,利用反射动态创建对象
利用反射给属性赋值,利用反射给属性赋值,利用反射给属性赋值
利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来打印或导出excel!利用反射来...
利用反射和动态代理机制实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34087833
利用反射和代理实现简单的Spring,有良好的注释,代码清晰、简单。
java 利用反射获取内部类静态成员变量的值操作.docx
dom4j解析xml,利用反射机制.将解析出来的信息保存到一个类当中
利用反射,注解将数据输出至Excel中 亲测可用 运行良好
这个是我自己利用反射机制封装的模仿hibernate的持久层工具,用于学习。里面有我的联系方式,工具类jar包和示例以及源码。有问题或者希望共通学习的同学可以联系我,寻求志同道合之人
利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性...
利用反射创建的增删改查,保存时只需传入一个对象即可,不需要写配置文件。使用hjz.jar时,首先 Session s = new Session();然后执行数据库操作。
利用反射,接口等技术。更好的分层,封闭。
主要介绍了详解Golang利用反射reflect动态调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
利用反射获取.net托管的DLL或EXE文件的内部信息,包括DLL或EXE文件内部的模块、类、方法、字段等信息。
C 中仅头文件,非侵入式和无宏运行时运行时反射系统
C# 利用反射动态创建对象,可以动态加载主菜单,可以根据主菜单来弹出窗体
利用反射实现类的动态加载
winfrom 利用反射 加载窗体 , 包括弹出窗体 和 tablePage动态加载窗体. 具体的见 文章: https://blog.csdn.net/djk8888/article/details/131597868
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...