关于C#基础知识回顾--反射(二)
2023-06-13 09:15:03 时间
MethodInfo中的Invoke()方法。调用形式:
这里ob是一个对象引用,将调用它所指向的对象上的方法。对于静态方法,ob必须为null。
所有需要传递给方法的参数都必须在args数组中指定。如果方法不需要参数,则args必须为null。
另外,数组args的元素数量参数必须等于参数的数量。Invoke()方法返回被调用方法的返回值。
要调用某个方法,只需在一个MethodInfo实例上调用Invoke(),该实例通过调用
GetMethods()
方法获得。请看事例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Reflection;
namespaceReflection
{
classProgram
{
staticvoidMain(string[]args)
{
//Demo1();
InvokeMethDemo();
Console.ReadKey();
}
staticvoidInvokeMethDemo()
{
//获得MyClass的类型队形
Typet=typeof(MyClass);
MyClassreflectOb=newMyClass(10,20);
Console.WriteLine("类名:{0}",t.Name);
Console.WriteLine("本类所提供的方法有:");
MethodInfo[]mi=t.GetMethods();
intval;
foreach(MethodInfominmi)
{
Console.WriteLine();
//显示参数
ParameterInfo[]pi=m.GetParameters();
if(m.Name=="Set"&&pi[0].ParameterType==typeof(int))
{
Console.Write("Set(int,int) ");
object[]args=newobject[2];
args[0]=9;
args[1]=18;
m.Invoke(reflectOb,args);
}
elseif(m.Name=="Set"&&pi[0].ParameterType==typeof(double))
{
Console.Write("Set(double,double) ");
object[]args=newobject[2];
args[0]=2.34;
args[1]=13.56;
m.Invoke(reflectOb,args);
}
elseif(m.Name.CompareTo("Sum")==0){
Console.Write("Sum()");
val=(int)m.Invoke(reflectOb,null);
Console.WriteLine("Sumis{0}",val);
}
elseif(m.Name.CompareTo("IsBetween")==0)
{
object[]args=newobject[1];
args[0]=17;
if((bool)m.Invoke(reflectOb,args))
{
Console.WriteLine("{0}在x和y之间",args[0]);
}
}
Console.WriteLine();
}
}
}
}
classMyClass
{
intx;
inty;
publicMyClass(inti,intj)
{
x=i;
y=j;
}
publicintSum()
{
returnx+y;
}
publicboolIsBetween(inti)
{
if(x<i&&i<y)
returntrue;
else
returnfalse;
}
publicvoidSet(inta,intb)
{
x=a;
y=b;
Show();
}
publicvoidSet(doublea,doubleb)
{
x=(int)a;
y=(int)b;
Show();
}
publicvoidShow()
{
Console.WriteLine("x:{0},y:{1}",x,y);
}
}
运行结果如下: