一般咱們使用類的名稱建立一個實例/類的對象,例如,若是我有一個名爲 User 的類,咱們會去這樣建立這個類。框架
1 User UR = new User(); 2 UR.ID = 1; 3 UR.Name = "Kailash";
但若是有人你在讓你在應用程序運行時或者經過字符串做爲類名建立一個類的實例,你將如何作? 別擔憂,微軟.Net 框架提供了一種解決方案。 在System.Reflection名稱空間的 Assembly類和System名字空間的和Activator 類可讓你在運行時建立類的實例。 請看下方。ide
Mycrosoft.Net 框架提供的程序集類用於獲取詳細信息或閱讀有關您的應用程序的程序集。 (這意味着程序集是可重複使用、 版本化的和自我描述的公共語言運行庫應用程序構造塊。)有關程序集類的更多詳細信息請訪問此站點。函數
此類包含建立本地或遠程類型的對象或者獲取對現有的遠程對象的引用的方法。 這個類不能被繼承 更多詳細信息請訪問此網站。學習
在 Visual Studio 中建立一個控制檯項目並提供項目的名稱,而後按肯定按鈕。 會建立你的Main方法。 添加System.Reflection 命名空間的引用:網站
1 namespace DynamicCreateInstanceofclass 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 } 8 } 9 }
聲明一個"User"類,有如下屬性。spa
1 public class User 2 { 3 public int ID { get; set; } 4 public string Name { get; set; } 5 }
聲明名稱"IUser"的接口 並這爲個接口聲明GetUserDetails。方法 此函數將返回一個User類翻譯
1 interface IUser 2 { 3 User GetUserDetails(); 4 }
聲明另外一個類的名稱將繼承前面的接口 (IUser) 的 UserDetails。 在繼承類中編寫一些代碼。code
1 public class UserDetails:IUser 2 { 3 public User GetUserDetails() 4 { 5 User UR = new User(); 6 UR.ID = 1; 7 UR.Name = "Kailash"; 8 return UR; 9 } 10 }
聲明一個靜態函數 CreateInstance 這個函數會接受一個接口和類名做爲參數,以下:對象
1 public static I CreateInstance<I>() where I : class 2 { 3 string assemblyPath = Environment.CurrentDirectory + "\\DynamicCreateInstanceofclass.exe"; 4 5 Assembly assembly; 6 7 assembly = Assembly.LoadFrom(assemblyPath); 8 Type type = assembly.GetType("DynamicCreateInstanceofclass.UserDetails"); 9 return Activator.CreateInstance(type) as I; 10 }
在前面的代碼,字符串變量包含您的應用程序集的路徑。 第5行建立一個assembly對象。 第7 行是加載應用程序集的靜態函數 LoadFrom ,它將程序集路徑做爲一個字符串參數。 第8行的GetType 函數用類的完整名稱 或命名空間名稱做爲參數,並返回類的類型。 第9行的CreateInstance 函數是類的靜態函數的activator類的類型,返回該類的實例。blog
在主函數編寫下面的代碼,打印GetUserdetails函數的返回值:
1 static void Main(string[] args) 2 { 3 //DynamicCreateInstanceofclass 4 5 // UserManager UM = new UserManager(); 6 7 User UR= CreateInstance<IUser>().GetUserDetails(); 8 9 Console.WriteLine("User ID:" + UR.ID); 10 Console.WriteLine("User Name:" + UR.Name); 11 12 Console.WriteLine("Press Key to exit"); 13 Console.ReadLine(); 14 }
完整代碼
1 namespace DynamicCreateInstanceofclass 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //DynamicCreateInstanceofclass 8 9 // UserManager UM = new UserManager(); 10 11 User UR= CreateInstance<IUser>().GetUserDetails(); 12 13 Console.WriteLine("User ID:" + UR.ID); 14 Console.WriteLine("User Name:" + UR.Name); 15 16 Console.WriteLine("Press Key to exit"); 17 Console.ReadLine(); 18 } 19 public static I CreateInstance<I>() where I : class 20 { 21 string assemblyPath = Environment.CurrentDirectory + "\\DynamicCreateInstanceofclass.exe"; 22 23 Assembly assembly; 24 25 assembly = Assembly.LoadFrom(assemblyPath); 26 Type type = assembly.GetType("DynamicCreateInstanceofclass.UserDetails"); 27 return Activator.CreateInstance(type) as I; 28 } 29 } 30 public class UserDetails:IUser 31 { 32 public User GetUserDetails() 33 { 34 User UR = new User(); 35 UR.ID = 1; 36 UR.Name = "Kailash"; 37 return UR; 38 } 39 } 40 public class User 41 { 42 public int ID { get; set; } 43 public string Name { get; set; } 44 } 45 interface IUser 46 { 47 User GetUserDetails(); 48 } 49 }
在本文中,我但願你能學到如何在運行時建立一個類的實例。謝謝!
譯者按:老外的文章寫的很仔細,即便看起來很簡單的事情也講述的很詳細,這一點值得咱們學習,我用Transmate翻譯的同時,也儘可能保留原文的描述,避免信息的丟失。