动态调用方法问题

yangtao7754 2015-06-11 09:26:45
我现在有一个一般处理程序,我根据传来的方法名,调用具体方法,例如,我把Add做为字符串传入方法A,我要由方法A转到Add方法。我想知道除了反射调用外 还有其他的实现方法么。。。求个大神指点下
...全文
199 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
全局!你怎么反射的!感觉问题在你的反射上面,你的
method.Invoke(this,context)
是类似这样子吗?
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
引用 9 楼 starfd 的回复:
但是反射调用方法之后 在ProcessRequest方法里初始化的一些变量会丢失 context作为参数传递过去,或者声明一个全局的HttpContext.Current 然后context.Request访问前端传递的数据,没搞懂你所谓的变量丢失是什么意思,从来没碰到过丢失的问题,因为Request是不可修改的(当然通过反射可以修改,这个就不说了)
我定义了全局变量,在ProcessRequest里赋值,然后通过反射调用本类里的方法,在调用的方法里 全局变量的值为null
  • 打赏
  • 举报
回复
但是反射调用方法之后 在ProcessRequest方法里初始化的一些变量会丢失 context作为参数传递过去,或者声明一个全局的HttpContext.Current 然后context.Request访问前端传递的数据,没搞懂你所谓的变量丢失是什么意思,从来没碰到过丢失的问题,因为Request是不可修改的(当然通过反射可以修改,这个就不说了)
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
一般来说就反射,如果你乐意,通过switch,case也是可以的
switch case 就要写好多代码。。。 现在有好多要改的。。 想找个更好点的解决办法。。。
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
大神们有更好的解决办法么
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
我用的一般处理程序,每个一般处理程序有好多个处理方法 例如add delete之类。我前台页面通过传入一个url参数 lx=方法名 ,然后在ProcessRequest 跳转到对应的方法,现在用的是反射调用。 但是反射调用方法之后 在ProcessRequest方法里初始化的一些变量会丢失
我叫小菜菜 2015-06-11
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
一般来说就反射,如果你乐意,通过switch,case也是可以的
其实就是匹配方式的区别。 貌似反射内部是使用缓存方法名、通过map/hash进行匹配? if-switch也是一种简单的匹配机制,简单工厂模式就是用switch匹配的
小D2013 2015-06-11
  • 打赏
  • 举报
回复
同意2楼的观点
bdmh 2015-06-11
  • 打赏
  • 举报
回复
如果是web,你这就是mvc的概念,传入action的名字,就自动执行对应action代码
  • 打赏
  • 举报
回复
一般来说就反射,如果你乐意,通过switch,case也是可以的
  • 打赏
  • 举报
回复
如果只是web方式http访问的话,asp.net 的机制是使用 xxxxx.ashx 文件名区分。不要再画蛇添足!
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
引用 14 楼 Z65443344 的回复:

            object[] Obj = new object[] { };
            MethodInfo vMethodInfo = GetType().GetMethod(FunctionName);
            if (vMethodInfo == null)
            {
                return;
            }
            vMethodInfo.Invoke(this, Obj);
太给力了。。。
於黾 2015-06-11
  • 打赏
  • 举报
回复

            object[] Obj = new object[] { };
            MethodInfo vMethodInfo = GetType().GetMethod(FunctionName);
            if (vMethodInfo == null)
            {
                return;
            }
            vMethodInfo.Invoke(this, Obj);
於黾 2015-06-11
  • 打赏
  • 举报
回复
object o = Activator.CreateInstance(type); 这是闹哪样 这是给实例化了一个
yangtao7754 2015-06-11
  • 打赏
  • 举报
回复
public override void ProcessRequest(HttpContext context)
        {
            this.Init(context);
            if (!this.PowerCheck())
            {
                context.Response.Write("{\"result\":false,\"message\":\"你没有权限访问该模块!\",type:\"NoAuthority\"}");
                return;
            }
            string param = context.Request.Params["lx"];
            try
            {
                Type type = this.GetType();
                object o = Activator.CreateInstance(type);
                // 1.根据方法名动态调用方法  
                type.InvokeMember(param, BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { context });
            }
            catch (Exception ex)
            {
                context.Response.Write("参数错误");
                throw ex;
            }
        }
代码大概是这样的,Init方法是初始化参数的

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧