本来是在设计模式中的工厂方法,在实现抽象工厂时,用到了一直都不熟悉的反射。
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方法的,囧。