[译文]运行时利用反射动态地创建类的实例

介绍

通常我们使用类的名称创建一个实例/类的对象,例如,如果我有一个名为 User 的类,我们会去这样创建这个类。

1 User UR = new User();  
2 UR.ID = 1;  
3 UR.Name = "Kailash";  

但如果有人你在让你在应用程序运行时或者通过字符串作为类名创建一个类的实例,你将如何做? 别担心,微软.Net 框架提供了一种解决方案。 在System.Reflection名称空间的 Assembly类和System名字空间的和Activator 类可以让你在运行时创建类的实例。 请看下方。

Assembly 

Mycrosoft.Net 框架提供的程序集类用于获取详细信息或阅读有关您的应用程序的程序集。 (这意味着程序集是可重复使用、 版本化的和自我描述的公共语言运行库应用程序构造块。)有关程序集类的更多详细信息请访问此站点

Activatior 

此类包含创建本地或远程类型的对象或者获取对现有的远程对象的引用的方法。 这个类不能被继承 更多详细信息请访问此网站

入门教程

在 Visual Studio 中创建一个控制台项目并提供项目的名称,然后按确定按钮。 会创建你的Main方法。 添加System.Reflection 命名空间的引用:

1 namespace DynamicCreateInstanceofclass  
2 {  
3     class Program  
4     {  
5         static void Main(string[] args)  
6         {  
7         }  
8     }  
9 }  

 

声明一个"User"类,有以下属性。

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。 在继承类中编写一些代码。

 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类的类型,返回该类的实例。

在主函数编写下面的代码,打印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 }  
View Code

 

在本文中,我希望你能学到如何在运行时创建一个类的实例。谢谢!

译者按:老外的文章写的很仔细,即使看起来很简单的事情也讲述的很详细,这一点值得我们学习,我用Transmate翻译的同时,也尽量保留原文的描述,避免信息的丢失。

原文地址

posted on 2015-03-14 09:55  harrell  阅读(1226)  评论(1编辑  收藏  举报