通过反射找到并执行方法

news/2024/7/3 8:21:50

需求是通过传入方法的名字,执行该方法,所有的方法都是传入一个model参数,但model的类型不一样。

通过上网查资料,整理了一下,具体代码如下:

      /// <summary>
        /// 执行方法(方法类型需要是公共的)
        /// </summary>
        /// <returns></returns>
        public ActionResult ExecutionMethod()
        {
            try
            {
                
                #region 通过反射找到方法所属的类并传入相应的model执行该方法

                // 1.执行方法的类 Load(命名空间名称),GetType(命名空间.类名) 
                Type type = Assembly.Load("命名空间名称").GetType("命名空间名称.类名");
                // 1.执行方法所需要的model Load(命名空间名称),GetType(命名空间.类名)
dynamic model = Assembly.Load("命名空间名称").GetType("命名空间名称.类名"); // 2.GetMethod(需要调用的方法名称) MethodInfo method = type.GetMethod("方法名"); // 3.调用的实例化方法(非静态方法)需要创建类型的一个实例 object obj = Activator.CreateInstance(type); // 3.实例化model dynamic models = Activator.CreateInstance(model); // 4.方法需要传入的参数,从Session获取到的参数反序列化为键值对类型 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(Session["modelData"].ToString()); // 遍历传入的参数键值对,并赋值给实例化的model类 foreach (var item in dic) { PropertyInfo _Property = models.GetType().GetProperty(item.Key); if (_Property != null && _Property.CanRead) { //object的数值类型为Int64需要强制转换为Int32 if (item.Value.GetType().ToString() == "System.Int64") { _Property.SetValue(models, Convert.ToInt32(item.Value), null); } else { //给实例化的model赋值 _Property.SetValue(models, item.Value, null); } } }
// 执行查询方法所需要传入的参数 object[] parameters = new object[] { models };

          // 5.调用方法,如果调用的是一个静态方法,就不需要第3步(创建类型的实例) // 相应地调用静态方法时,Invoke的第一个参数为null object result = method.Invoke(obj, parameters);
#endregion
return Json(new { IsSuccess = true ,Result = result}, JsonRequestBehavior.AllowGet); }
catch(Exception ex)
{
return Json(new { IsSuccess =
false ,Result = ""}, JsonRequestBehavior.AllowGet);
}
    }

 

转载于:https://www.cnblogs.com/LYF1997/p/10717112.html


http://www.niftyadmin.cn/n/3843815.html

相关文章

001 内联函数

//透彻了解inlining的里里外外 //inline函数看起来像函数&#xff0c;行为像函数&#xff0c;比宏好得多&#xff0c;可以免除调用函数的开销。//过度使用inline函数&#xff0c;导致程序体积过大&#xff0c;代码膨胀导致额外的换页行为&#xff0c;降低指令高速缓存的击中率。…

兰州新区农村“三变”改革:近万农民“变身”企业工人

图为兰州新区现代农业示范园的温室大棚栽植的百合花。 魏建军 摄 图为兰州新区现代农业示范园的温室大棚栽植的百合花。 魏建军 摄 中新网兰州1月24日电(记者 魏建军)寒冬时节&#xff0c;兰州新区现代农业示范园的温室大棚里暖意融融。只身从永登古山乡来这里管理草莓大棚的王…

改善用户体验 Web前端优化策略总结

前端是庞大的&#xff0c;包括HTML、CSS、Javascript、Image、Flash等等各种各样的资源。前端优化是复杂的&#xff0c;针对方方面面的资源都有不同的方式。那么&#xff0c;前端优化的目的是什么&#xff1f;1. 从用户角度而言&#xff0c;优化能够让页面加载得更快、对用户的…

linux7.0开启IP转发功能

开启IP转发功能 cat /proc/sys/net/ipv4/ip_forward 查看IP转发功能是否开启 vim /usr/lib/sysctl.d/00-system.conf 修改其配置文件 net.ipv4.ip_forward 1 开启IP转发功能 “0”代表没有开启 sysctl -p /usr/lib/sysctl.d/00-system.conf //刷入系统

紧急的版本,时间很紧,没有时间写用例,如何做好测试?

**1、安排业务熟悉的人做这个紧急版本的测试2、把版本的的修改点&#xff0c; 新增需求搞清楚&#xff0c;搞清楚这些变更是如何实现的3、罗列主流程的测试用例&#xff08;思维导图&#xff09;&#xff0c;优先保证主流程没有问题&#xff0c;然后再发散测试4、在执行测试过程…

Servlet生命周期 和 继承关系

三 servlet的生命周期 &#xff08;一个servlet类的对象 创建----》销毁&#xff09;第一次访问 某个servlet的时候 首先调用其 构造函数public StudentServlet(){System.out.println("servlet被创建了");}第一次访问 在构造函数之后 调用其 init初始化方法 &#x…

Python 迭代器、生成器和列表解析

迭代器 迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口。 Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象。即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等。迭代器有以…

linux7.0计划任务

计划任务为用户 natasha 配置一个定时计划任务&#xff0c;在每天 14:23 分执行 I AM RHCE which echo 查看ehco命令位置 id natasha 查看是否存在natasha用户 useradd natasha 创建natasha用户 crontab –e –u natasha 对natasha用户配置计划任务 23 14 * * * /usr/bin/echo …