【IT168技术文档】
如果用户需要的是Windows.Forms里面的数十种控件,那么你的Select语句也要写数十行吗?我当然不是想要做这种刁难的用户,但是需求总是多种多样的,若有一种方法能够在运行时任意指定对象的创建类型,甚至是用表示类型的名字的字符串创建所需的对象,该有多么方便。.net Framwork的反射机制给我们带来了解决问题的方法。这里,若只需要创建一般的对象,我们可以通过System.Activator来实现,而较复杂的我们可以通过获取构造方法来实现。
反射Reflection是.net中重要机制,很多人已经介绍过反射,我们来简单复习一下。通过反射,可以在运行时获得.net中每一个类型(包括类、结构、委派、接口、枚举)的成员,包括方法、属性、事件以及构造函数等,还可以获得每个成员的名称、限定符和参数等,有了反射,就可以对每一个类型了如指掌。如果获得了构造函数的信息,就可以直接创建对象,即使这个对象的类型在编译的时候还不知道。
在完成运行时创建控件这一任务前,我们先看一个简单的例子,建立一个名为VBAppliction的Windows程序,添加一个新文件,输入一个新类:
第一行GetType(MyClassTest)函数就已经获得了我们创建的类的类型对象(C#中使用typeof函数)。接下来,我们用了 System.Activator类的一个静态方法CreateInstance创建出对象实例,并将对象引用赋给o。Activator是一个用来在创建本地或远程对象的工具。运行这个程序,我们可以从Commond Window(命令窗口,一般在调试状态IDE的右下方)看到WriteLine函数运行的结果,可以看到正确建立的对象。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()
如果我们用的类具有比较复杂的构造函数,还可以使用构造函数创建所需的对象,代码如下:
这里我们创建一个System.Reflection.ConstructorInfo的对象,通过它可以获得类构造方法的信息。我们用的是Type类的GetConstructor方法来搜索可用的构造方法。''方法二 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()