关于C#基础知识回顾--反射(二)
程序员文章站
2024-02-15 14:54:22
使用反射调用方法:一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在methodinfo中的invoke()方法。调用形式:object invoke...
使用反射调用方法:
一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在
methodinfo中的invoke()方法。调用形式:
object invoke(object ob, object[] args)
这里ob是一个对象引用,将调用它所指向的对象上的方法。对于静态方法,ob必须为null。
所有需要传递给方法的参数都必须在args数组中指定。如果方法不需要参数,则args必须为null。
另外,数组args的元素数量参数必须等于参数的数量。invoke()方法返回被调用方法的返回值。
要调用某个方法,只需在一个methodinfo实例上调用invoke(),该实例通过调用
getmethods()
方法获得。请看事例:
复制代码 代码如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.reflection;
namespace reflection
{
class program
{
static void main(string[] args)
{
// demo1();
invokemethdemo();
console.readkey();
}
static void invokemethdemo()
{
//获得myclass的类型队形
type t = typeof(myclass);
myclass reflectob = new myclass(10, 20);
console.writeline("类名:{0}", t.name);
console.writeline("本类所提供的方法有:");
methodinfo[] mi = t.getmethods();
int val;
foreach (methodinfo m in mi)
{
console.writeline();
//显示参数
parameterinfo[] pi = m.getparameters();
if (m.name == "set" && pi[0].parametertype == typeof(int))
{
console.write("set(int,int) ");
object[] args = new object[2];
args[0] = 9;
args[1] = 18;
m.invoke(reflectob, args);
}
else if (m.name == "set" && pi[0].parametertype == typeof(double))
{
console.write("set(double,double) ");
object[] args = new object[2];
args[0] = 2.34;
args[1] = 13.56;
m.invoke(reflectob, args);
}
else if (m.name.compareto("sum") == 0) {
console.write("sum() ");
val = (int)m.invoke(reflectob, null);
console.writeline("sum is {0}",val);
}
else if(m.name.compareto("isbetween")==0)
{
object[] args = new object[1];
args[0] = 17;
if ((bool)m.invoke(reflectob, args))
{
console.writeline("{0}在x和y之间",args[0]);
}
}
console.writeline();
}
}
}
}
class myclass
{
int x;
int y;
public myclass(int i, int j)
{
x = i;
y = j;
}
public int sum()
{
return x + y;
}
public bool isbetween(int i)
{
if (x < i && i < y)
return true;
else
return false;
}
public void set(int a, int b)
{
x = a;
y = b;
show();
}
public void set(double a, double b)
{
x = (int)a;
y = (int)b;
show();
}
public void show()
{
console.writeline("x:{0},y:{1}", x, y);
}
}
运行结果如下: