问个有点难度的问题, 关于反射动态调用方法
那么,首先,JS在调用的时候会传递几个入参进来, 比如 类名 函数名 参数
首先,根据类名,可以找到 需要调用的类型 Type type = Activator.CreateInstance
然后,根据函数名称, 可以找到 需要调用的MethodInfo.
MethodInfo methodInfo = type.GetMethod(methodName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
接着,就可以获取到参数列表了。就可以调用了。
ParameterInfo[] paramInfos = methodInfo.GetParameters();
var paramObjs = new object[paramInfos .Length];
// 填充参数
methodInfo.Invoke(sink, paramObjs);
===================
我的问题来了,
我的参数不是简单类型参数, 而是一个JSON数据对象。
比如某函数的参数为QueryCustomerReq,定义为:
public class QueryCustomerReq
{
public string PhoneNumber { get; set; }
public string PostalCode { get; set; }
}
那么在调用此函数传递这个参数的时候,使用的JSON对象是:
var oParam = {};
oParam.PhoneNumber = "XXXXXXXXX";
oParam.PostalCode = "YYYYYYYY";
一般情况下,使用JavaScriptSerializer类来反序列化JSON.如
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.Deserialize<QueryCustomerReq>("{PhoneNumber:'sss', PostalCode :'YYY'}");
这样是可以的!
但是!这里模板参数不能在编译期确定,因为调用哪个函数是脚本决定的。 也就是说, 必须根据ParameterInfo.ParameterType来决定怎么反序列化这个JSON对象。
到底如何做才能解决这个问题呢?
=============
方式1: 一个很大的switch, MY GOD, 这种方式杀了我吧, 我不可能维护这个switch的。
方式2: 从JavaScriptConverter派生自己的类,然后JavaScriptSerializer.RegisterConverters 注册这个类,然后使用JavaScriptSerializer.DeserializeObject来转换。
这样也是不可能的, 因为JavaScriptConverter的派生类仍然需要调用基类的ConvertToType<T>来实现转换。 我的参数类型是无限的。
方式3: 使用DynamicMethod, 我觉得这种是唯一可行的方式。 生成一个DynamicMethod, 这个DynamicMethod里面完成类型转换后再调用目标函数, 但是好复杂,不知道写, 忘高人指点
相关推荐
利用java反射机制调用类的私有方法(推荐)
下面小编就为大家带来一篇利用java反射机制调用类的私有方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
C# 反射与动态编程
CSharp 反射与动态编程知识点
反射调用private方法实践(php、java)
单测中有个普遍性的问题,被侧类中的private方法无法直接调用。小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码。 简单被测试类 生成一个简单的被测试类,只有个private方法。 复制代码 代码如下: <?php/** * 崔小涣单测的基本模板。 * * @author cuihuan * @date 2015/11/12 22:15:31 * @version $Revision:1.0$ **/class MyClass {/** * 私有方法 * * @param $params * @return bool */private function priva
JAVA反射,降低JDBC使用难度
NULL 博文链接:https://cdh-java.iteye.com/blog/606805
php动态函数调用方法
php中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数 下面是一个简单的动态函数调用范例 <html> <head> <title>Dynamic Function Calls</title> </head> <body> <?php function sayHello() { echo "Hello<br>"; } $function_holder = "sayHello"; $function_holder(); ?> </body> </html> 以上所述就是本文的全部内容了,希望大家能够喜欢。 您可能


.NET Framework
