• 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方法的,囧。

  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
    POJ
    hdu-4745 Two Rabbits
    蓝桥杯历年试题 小朋友排队
    蓝桥杯历年试题 矩阵翻硬币
  • 原文地址:https://www.cnblogs.com/yanbinliu/p/3741548.html
Copyright © 2020-2023  润新知