之前看别人的文章说明反射时,总是先获取类型,然后创建该类型的一个对象,获取这个对象的方法,最后调用。对这个总是不是很理解,既然都明确要获取哪个类型了,那干嘛绕一大圈去创建这个对象呢?
class A
{
int type;
public virtual void func()
{
}
}
class B : A
{
public B()
{
type = 1;
}
public override void func()
{
}
}
//有一个方法,参数是父类A
void handleFunc(A a)
{
//如果这样调用,则只会调用父类的func
//a.func();
//而实际是希望调用子类的方法
//如果不使用反射,则
if(a.type == 1)
{
B b = (B)a;
b.func();
}
//如果使用反射,则
System.Type curType = a.GetType();
System.Reflection.MethodInfo methodInfo = curType.GetMethod("func");
methodInfo.Invoke(a, null);
//在不适用反射时,有新的子类则需要修改这个方法,而如果使用
//反射,则不用修改这个方法
}
//新增子类
class C : A
{
public C()
{
type = 2;
}
public override void func()
{
}
}
void handleFunc(A a)
{
//如果这样调用,则只会调用父类的func
//a.func();
//而实际是希望调用子类的方法
//如果不使用反射,则没增加一个子类,这个方法就需要改动一次
if(a.type == 1)
{
B b = (B)a;
b.func();
}
else if(a.type == 2)
{
C c = (C)a;
c.func();
}
}
今天对反射有了新理解。