1 昨天遇到一个同学提出了这样的一问题:

Controller c = Activator.CreateInstance(StarUpCommand) as Controller;

c.Execute(data); 

StarUpCommand类继承Controller类

Controller类有个abstract Execute()抽象方法,StarUpCommand类override重写了 Execute()方法。

问题是c现在是Controller的一个实例, c.Execute(data)为什么调用到StarUpCommand.cs里的Execute()方法?

2 我一下没摸到这个同学的思路,尝试这样回答:

Activator.CreateInstance方法创建了一个 StarUpCommand对象的实例,通过 as 类型转换为 StarUpCommand的父类、基类。

3 显然同学还是不太明白,继续追问到:

c为什么是StarUpCommand的实例不是Controller的实例?
Activator.CreateInstance(StarUpCommand)创建的是StarUpCommand类,但as 的是Controller,c的声明也是Controller类,c应该是Controller类的实例啊?

4 问得有意思,好像也是这么回事,我继续举了个例子,是在这里看到的 https://dotblogs.com.tw/jacky19819/2009/03/25/7692 

myObj是已经存在的对象,我们看下面代码

object myClass = new object();
myClass = Activator.CreateInstance(myObj.GetType());

這樣一來myClass就完全擁有myObj的方法和屬性了~~

++++++++++++

我们来看Activator.CreateInstance是怎么定义的:

 public static object CreateInstance(Type type);

他返回的是一个 object 对象,为什么要这样呢? 他通过反编译操作摸清了StarUpCommand类有哪些属性和方法,然后依样画葫芦创建了一个对象实例返回给你 ,他那里可没有StarUpCommand这张“图纸”啊,所以只能返回一个object 对象给你。

++++++++++++

既然这个对象已经具有了StarUpCommand的属性和方法,那自然可以类型转换为他的父类或者基类了。