通过例子,浅谈反射(Reflection)的应用

通过例子,浅谈反射 (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-

Published At
Categories with Web编程
Tagged with
comments powered by Disqus