通过例子,浅谈反射 (Reflection) 的应用
说明:
应该说这篇短文根本算不上什么深入的分析性的文章,所以在标题前加上了“浅谈”二字,希望对于一般的读者来说,可以给你一个相对直观些的对反射的认识。
-- 2005/05/23 于东莞
在这里对反射以及反射的概念在最后给出简要的解释。
一. 用来测试的程序集文件的建立。
首先你需要建立一个类库文件(编译后扩展名为 .dll ),名字假设为: reflection_newtest
系统会默认地新建一个类文件 class1 ,把它该成我们用来测试的类 person
具体代码如下: ( 类的代码比较简单,这里不做解释,如有不明之处,请查看类的相关文档 .)
Public Class person
Public firstname As String
Public lastname As String
Dim m_age As Short
Dim m_emailaddress(4) As String
Public Sub New ()
MyBase .new()
End Sub
Public Sub New ( ByVal firstname As String , ByVal lastname As String )
Me .firstname = firstname
Me .lastname = lastname
End Sub
Public Property age() As Short
Get
Return m_age
End Get
Set ( ByVal Value As Short )
m_age = Value
End Set
End Property
Public Property emailaddress( ByVal index As Short ) As String
Get
Return m_emailaddress(index)
End Get
Set ( ByVal Value As String )
m_emailaddress(index) = Value
End Set
End Property
Sub sendemail( ByVal msg As String , Optional ByVal priorty As Integer = 1)
Console.WriteLine("message to " & firstname & " " & lastname)
Console.WriteLine("priority " & priorty.ToString)
Console.WriteLine(msg)
End Sub
End Class
二. 测试验证的程序
建立一个 winform 的程序,命名假设为: testreflection
从工具栏里拖两个按钮,命名为 button1,button2.
1 .在程序的最上面加入引用:
Imports System
Imports System.Reflection
Imports System.Type
2 .在 button1 的 click 事件里写:
Dim asm As [Assembly] ‘ 由于 assembly 是关键字,所以要加 []
asm = Reflection.Assembly.LoadFrom("G:\ 练习 \reflection_newtest\bin\reflection_newtest.dll") ‘ 这里假设上面的 reflection_newtest 文件的位置在 G:\ 练习 的文件夹。
Console.WriteLine(asm.FullName) ‘输出完全限定名
Console.WriteLine(asm.Location) ‘获取该文件的基本代码格式的位置
Console.WriteLine(asm.CodeBase) ‘获取最初指定的程序集的位置,一般来说和 Location 方法很相似
Dim mo As [Module] ‘ 遍历模块
For Each mo In asm.GetModules
Console.WriteLine(mo.FullyQualifiedName)
Next
Dim ty As Type
For Each ty In asm.GetTypes ‘遍历所有类型的信息
Console.WriteLine(ty.FullName)
Next
‘动态加载一个实例
Dim o As Object = asm.CreateInstance("reflection_newtest.person")
Console.WriteLine("********************")
Console.WriteLine(o.GetType.FullName)
说明: 这里的使用都比较简单,请继续往下看!
3 .建立测试的过程
' 获取遍历的类型,这里使用了系统类库文件 mscorlib.dll
Private Sub testtypeenumeration()
Dim asm As [Assembly] = Reflection.Assembly.Load("mscorlib")
Dim t As Type
For Each t In asm.GetExportedTypes ‘ 对于当前的文件的测试
If t.IsClass Then ‘ 如果是类
Console.WriteLine(t.Name & "(class)")
ElseIf t.IsEnum Then ‘如果是枚举
Console.WriteLine(t.Name & "(enum)")
ElseIf t.IsValueType Then ‘如果是值类型
Console.WriteLine(t.Name & "(structure)")
ElseIf t.IsInterface Then ‘如果是接口
Console.WriteLine(Name & "(interface)")
Else ‘其他
' 没做处理
End If
Next
End Sub
' 获取某一类型的所有信息 ( 这里以 string 为例 )
‘从上面的 load 与 type.gettype 可见,他们都是创建 assembly 的方式
Private Sub testatypememberinfo1()
Dim stringtype As Type = Type.GetType("System.String") ' 获取指定名称的系统类型,也可以使用 type.gettype(string)
Dim minfos() As MemberInfo ‘类型数组
Dim mi As MemberInfo
minfos = stringtype.GetMembers
For Each mi In minfos
Console.WriteLine(mi.Name)
Next
' 获得公共的非共享的并且是继承的成员
minfos = stringtype.GetMembers(BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly)
‘ 为了便于看清楚输出,做了间隔
Console.WriteLine("*********************")
For Each mi In minfos
Console.WriteLine(mi.Name)
Next
‘同样的间隔设置
Console.WriteLine("*********************")
' 获取所有方法
For Each mi In stringtype.GetMethods
Console.WriteLine(mi.Name)
Next
End Sub
' 使用特定的显示某一种类型的方法
Private Sub testatypememberinfo()
Dim stringtype As Type = Type.GetType("System.String") ' 获取指定名称的系统类型
<span style="FONT-