问题描述
voidgo(stringi){stringming="haha";ming=ming+i;ming();//这个方法是存在的}
如何才能将变量值作为方法名使用啊?
解决方案
解决方案二:
查下反射varmethod=type.GetMethod(methodName);if(method!=null){method.Invoke(this);}
解决方案三:
通过反射,找到符合名字的method,然后invoke
解决方案四:
出现这种情况就是你命名不规范了。函数一般是一个动作,用一个动词开头的单词,例如:GetData、SetData而变量一般是一个名词,例如:data而且还有大小写的习惯,怎么也不会出现你说的冲突。
解决方案五:
反射privatevoidDoFunction(stringFunctionName){object[]Obj=newobject[]{};MethodInfovMethodInfo=GetType().GetMethod(FunctionName);if(vMethodInfo==null){return;}vMethodInfo.Invoke(this,Obj);}
解决方案六:
注意想反射调用的函数必须设置成public
解决方案七:
用委托呀。。。。
解决方案八:
引用1楼starfd的回复:
查下反射varmethod=type.GetMethod(methodName);if(method!=null){method.Invoke(this);}
for(inti=1;i<100;i++){type.GetMethod("go"+i.ToString())().invoke(this);}
这样会不会就运行go1()go2()……go100()啊?
解决方案九:
你有这么多方法的话,会执行,如果不是的话,会产生异常,当然那个this你得改为对应的实体对象
解决方案十:
已经判断method!=null了所以不会执行出错如果没有,它会是null的
解决方案十一:
引用8楼starfd的回复:
你有这么多方法的话,会执行,如果不是的话,会产生异常,当然那个this你得改为对应的实体对象
搞不定啊,我在Main中使用for(inti=1;i<3;i++){type.GetMethod("go"+i.ToString())().invoke(this);}提示错误,提示type的名空间不存在publicvoidgo1(){login1();sendinfo1();//goN中还调用了两个loginN和sendinfoN函数}
解决方案十二:
for(inti=1;i<3;i++){Typetype=typeof(Program);type.GetMethod("go1").invoke(this);}这样以后还是出错,提示errorCS1061:Type`System.Reflection.MethodInfo'doesnotcontainadefinitionfor`invoke'andnoextensionmethod`invoke'oftype`System.Reflection.MethodInfo'couldbefound.Areyoumissinganassemblyreference?
解决方案十三:
usingSystem.IO;usingSystem;usingSystem.Reflection;classProgram{staticvoidMain(){for(inti=1;i<3;i++){Typetype=typeof(Program);type.GetMethod("go"+i).invoke(this);}}publicvoidgo1(){Console.WriteLine("Hello,World111");}publicvoidgo2(){Console.WriteLine("Hello,World222");}publicvoidgo3(){Console.WriteLine("Hello,World333");}}
解决方案十四:
是Invoke不是invoke你连错误都看不懂吗?
解决方案十五:
type.GetMethod("go1").invoke(this,newobject[])没有一个参数的重载即使被调用的参数没有参数,你也得传个空数组进去
解决方案:
还有大小写也要区分清楚
解决方案:
引用13楼shingoscar的回复:
是Invoke不是invoke你连错误都看不懂吗?
这样还是不对啊usingSystem.IO;usingSystem;usingSystem.Reflection;classProgram{publicvoidha(){for(inti=1;i<3;i++){Typetype=typeof(Program);type.GetMethod("go"+i).Invoke(this,newobject[1]);}}staticvoidMain(){Programp=newProgram();p.ha();}publicvoidgo1(){Console.WriteLine("Hello,World111");}publicvoidgo2(){Console.WriteLine("Hello,World222");}publicvoidgo3(){Console.WriteLine("Hello,World333");}}
解决方案:
this.GetType().GetMethod("g1").Invoke(this,null);
解决方案:
newobject[1]是啥鬼new个数组也不会new了吗
解决方案:
newobject[1]改为null
解决方案:
不行你先定义个数组object[]obj;然后传递进去别在里面new了
解决方案:
newobject[1]表示有一个元素相当于你要给函数传递一个变量,然后这个变量是null
解决方案:
引用19楼WM_JAWIN的回复:
newobject[1]改为null
usingSystem.IO;usingSystem;usingSystem.Reflection;classProgram{publicvoidha(){for(inti=1;i<3;i++){Typetype=typeof(Program);type.GetMethod("go"+i.ToString()).Invoke(this,null);}}staticvoidMain(){Programp=newProgram();p.ha();}publicvoidgo1(){login1();sendinfo1();}publicvoidgo2(){login2();sendinfo2();}....publicvoidgoN(){loginN();sendinfoN();}}
这样搞定了,但是go1go2goN太多重复了,怎么样才能用for循环定义100个go1()到go100()
解决方案:
引用22楼rbbcnm的回复:
这样搞定了,但是go1go2goN太多重复了,怎么样才能用for循环定义100个go1()到go100()
就算你实现了自动生成10000个方法,又有什么意义呢如果方法里的代码都一样,那就根本用不到那么多如果不一样,生成了有啥用,还不是得挨个改里面的代码
解决方案:
如果只是想实现定义100个函数,而里面先不写方法最简单的办法可以先写excel表格里然后鼠标一拖拽就自动增长,名字就都不相同了
解决方案:
初步判定设计思路有问题
解决方案:
引用25楼WM_JAWIN的回复:
初步判定设计思路有问题
没错,因为调用很多个dll里的函数,所以只能这么做如何用for语句创建100个下面的函数啊?publicvoidgo1(){login1();sendinfo1();}publicvoidgo2(){login2();sendinfo2();}....publicvoidgoN(){loginN();sendinfoN();}
解决方案:
和调用goN方式,直接调用LoginN和sendinfoN
解决方案:
通过方法名动态调用方法,是合理的需求但用for循环定义100个方法就完全不合理了!循环产生的是结果相同的代码,最多只是参数不同。那么就只需写一个方法就解决问题了如果生成的代码是按预先保存的规则(格式)进行的,那么写这些规则和直接写代码优势在哪里呢?C#已经提供了动态生成Lamda表达式和动态编译C#代码的手段,你可以尝试用一下
解决方案:
引用28楼xuzuning的回复:
通过方法名动态调用方法,是合理的需求但用for循环定义100个方法就完全不合理了!循环产生的是结果相同的代码,最多只是参数不同。那么就只需写一个方法就解决问题了如果生成的代码是按预先保存的规则(格式)进行的,那么写这些规则和直接写代码优势在哪里呢?C#已经提供了动态生成Lamda表达式和动态编译C#代码的手段,你可以尝试用一下
技多不压身啊,即使现在的问题确实用不到批量建函数,但是万一以后用到呢?能不能用for循环批量建函数啊?