用Activator.CreateInstance代替new實現類的實例化(轉)


一直想得到這樣一個函數,輸入一個類的名稱為參數,返回一個相應的類的實例.

這在工廠模式中是非常有用的

這樣,可以使程序有更高的擴展性,例如,,下面的例子

如果現在有一個類,專門用來計算交通工具的速度,不同的交通工具計算方法是不一樣的,但是到底有那些交通工具是未知的或者是可變的,這種情況下,我們可能覺得要在添加交通工具的時候,需要修改用來計算速度的那個類,

但如果用Activator .CreateInstance創建實例,通過接口技術,則只要向程序集添加一個交通工具類,而不需要修改任何其它代碼..實現了高擴展性.,

示例如下:

//接口:比如,在上例中,可以是交通工具必需實現的接口

using System;

namespace ActivatorCreateInstance
{
 /// <summary>
 /// IObjcet 的摘要說明。
 /// </summary>
 public interface IObjcet
 {
  void printName();
 }
}


//實現接口的類:比如在上例中,是交通工具類,這種類可以在擴展的時候添加,其它類的代碼不用修改

using System;

namespace ActivatorCreateInstance
{
 /// <summary>
 /// ClassExam 的摘要說明。
 /// </summary>
 public class ClassExam:IObjcet
 {
  private string name="default name";
  public ClassExam()
  {
   
  }

  public ClassExam(string name)
  {
   this.name =name;
  }

  public void printName()
  {
   Console .WriteLine (this.ToString ()+"'s name is:");
  Console .WriteLine (this.name );

  }
  }
}

 

//程序入口:


namespace ActivatorCreateInstance
{
 /// <summary>
 /// main 的摘要說明。
 /// </summary>
 public class main
 {
  public main()
  {
   
  }

  public static void Main()
  {

//用傳遞參數來得到一個類的實例


   //用Activator .CreateInstance創建函數實例,默認的不帶參數的構造函數
   IObjcet obj=(IObjcet)Activator .CreateInstance(System.Type .GetType ("ActivatorCreateInstance.ClassExam,ActivatorExample" ),null);
   //System.Type .GetType  命名空間.類名,程序集
   obj.printName();

   //調用ClassExam類的另一個帶參數構造函數
   IObjcet obj2=(IObjcet)System.Activator .CreateInstance (System.Type .GetType ("ActivatorCreateInstance.ClassExam,ActivatorExample" ),new string []{"seted new name"});
   obj2.printName ();
  }
 }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM