技术开发 频道

.net中实现运行时从字符串动态创建对象


【IT168技术文档】

  如果用户需要的是Windows.Forms里面的数十种控件,那么你的Select语句也要写数十行吗?我当然不是想要做这种刁难的用户,但是需求总是多种多样的,若有一种方法能够在运行时任意指定对象的创建类型,甚至是用表示类型的名字的字符串创建所需的对象,该有多么方便。.net Framwork的反射机制给我们带来了解决问题的方法。这里,若只需要创建一般的对象,我们可以通过System.Activator来实现,而较复杂的我们可以通过获取构造方法来实现。

  反射Reflection是.net中重要机制,很多人已经介绍过反射,我们来简单复习一下。通过反射,可以在运行时获得.net中每一个类型(包括类、结构、委派、接口、枚举)的成员,包括方法、属性、事件以及构造函数等,还可以获得每个成员的名称、限定符和参数等,有了反射,就可以对每一个类型了如指掌。如果获得了构造函数的信息,就可以直接创建对象,即使这个对象的类型在编译的时候还不知道。
  
  在完成运行时创建控件这一任务前,我们先看一个简单的例子,建立一个名为VBAppliction的Windows程序,添加一个新文件,输入一个新类:
 Public Class MyClassTest    Private MyField As String    Public Sub New()    MyField = "Hi!"    End Sub    Public Sub Hello()    Console.WriteLine(MyField)    End Sub   End Class   然后加给窗体入一个新按钮,输入以下事件代码:      ''方法一      Dim t As Type = GetType(MyClassTest)   o = System.Activator.CreateInstance(t)   o.Hello()
  第一行GetType(MyClassTest)函数就已经获得了我们创建的类的类型对象(C#中使用typeof函数)。接下来,我们用了 System.Activator类的一个静态方法CreateInstance创建出对象实例,并将对象引用赋给o。Activator是一个用来在创建本地或远程对象的工具。运行这个程序,我们可以从Commond Window(命令窗口,一般在调试状态IDE的右下方)看到WriteLine函数运行的结果,可以看到正确建立的对象。
  
  如果我们用的类具有比较复杂的构造函数,还可以使用构造函数创建所需的对象,代码如下:
''方法二      Dim t As Type = GetType(MyClassTest)   Dim c As System.Reflection.ConstructorInfo Dim types() As Type   ReDim types(-1)   c = t.GetConstructor(Reflection.BindingFlags.Instance _    Or Reflection.BindingFlags.Public, _    Nothing, Reflection.CallingConventions.HasThis, types, Nothing)   Dim params() As Object   ReDim params(-1)   o.Hello()
  这里我们创建一个System.Reflection.ConstructorInfo的对象,通过它可以获得类构造方法的信息。我们用的是Type类的GetConstructor方法来搜索可用的构造方法。
0
相关文章