Assembly.CreateInstance和Activator.CreateInstance

本来是在设计模式中的工厂方法,在实现抽象工厂时,用到了一直都不熟悉的反射。

 1 namespace Factory
 2 {
 3     public abstract class Factory
 4     {
 5         public abstract Human CreateHuman(string humanType);
 6     }
 7     public class HumanFactory : Factory
 8     {
 9         public static readonly Assembly assembly = typeof(Human).Assembly;
10         
11         public override Human CreateHuman(string humanType)
12         {
13             Type[] ss = assembly.GetTypes();
14             string type = string.Concat("Factory.", humanType);
15             Human human = assembly.CreateInstance(type) as Human;
16             return human;
17         }
18     }
19 }

本来想用传进的humanType字符串来实例化一个类的,但是因为humanType只是类的名字(Name,不是FullName),所以总是创建实例不成功,得出的一直都是human=null的结果。

后来才发现在创建的过程中应该是在程序集中寻找类型的FullName来匹配的,也就是Namespace.ClassName,本例中就是Factory.humanType的。

PS:Activator.CreateInstance(type)也可以创建实例的,只不过参数是一个类型,本例中可以写为

Human human1 = Activator.CreateInstance(Type.GetType(type)) as Human;

至于两者的区别,除了Activator.CreateInstance是静态的,assembly.CreateInstance不是,其他还不清楚,有待进一步研究。

不过,Assembly类中的CreateInstance方法是调用了Activator.CreateInstance方法的,囧。

原文地址:https://www.cnblogs.com/yanbinliu/p/3741548.html