vb.net反射机制 反射教程

下午没事写了小东西,来复习下反射机制

1 首先建一个项目,名字叫“Net反射机制”,注意不能改成其他,不然不好验证

2 在窗体上放几个按钮,一个文本框,如图




项目中添加一个类 用来反射他:

Public Class ROBJ
Private result As Integer = 0
Public Sub New(ByVal _set As Integer)
result = _set
End Sub
Public Function Add(ByVal x As Integer,ByVal y As Integer) As Integer
Return x + y
End Function
Public Property MyResult() As Integer
Get
Return result
End Get
Set(ByVal value As Integer)
result = value
End Set
End Property
End Class

项目代码如下

Imports System.Reflection
Imports System.Text
Public Class Form1
'反射是一个很好工具,有时候可以突破面向对象的种种限制
'net程序层次:程序域—程序集—模块—类型—成员
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub 得到程序域所有程序集(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
Dim asm As Assembly() = System.AppDomain.CurrentDomain.GetAssemblies()
'具体引用外部dll可以 Assembly.LoadFrom (“ReflectionExample.exe”)
Dim a As Assembly
Dim result As New StringBuilder
For Each a In asm
result.Append(a.FullName & vbCrLf)
Next
Me.RichTextBox1.Text = result.ToString
End Sub

Private Sub 程序集的Load方式(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button3.Click
REM: Assembly.Load (AssemblyName) 在给定程序集的 AssemblyName 的情况下,加载程序集
REM Assembly.Load (Byte[]) 加载带有基于通用对象文件格式 (COFF) 的图像的程序集,该图像包含已发出的程序集。将该程序集加载到调用方的域
REM Assembly.Load (String) 通过给定程序集的长格式名称加载程序集
Dim result As New StringBuilder
'Dim asm As Assembly = Assembly.Load("Net反射机制,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null")
'Dim asm As Assembly = Assembly.LoadFrom("Net反射机制.exe")
Dim asm As Assembly = Assembly.Load("Net反射机制") '使用程序集来查找
Dim _t As Type() = asm.GetTypes
Dim _type As Type
For Each _type In _t
result.Append(_type.Name & vbCrLf)
Next
Me.RichTextBox1.Text = result.ToString
End Sub

Private Sub 反射类型成员(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button2.Click
Dim result As New StringBuilder
Dim asm As Assembly = Assembly.Load("Net反射机制")
Dim _t As Type() = asm.GetTypes
Dim _type As Type
For Each _type In _t
If _type.Name = "ROBJ" Then
result.Append(_type.Name & vbCrLf)
'BindingFlags.DeclaredOnly说明是自身的方法
Dim flag As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static Or BindingFlags.Instance Or BindingFlags.DeclaredOnly
Dim _method As MethodInfo() = _type.getmethods(flag)
Dim m As MethodInfo
For Each m In _method
result.Append("方法 " & m.Name & vbCrLf)
Dim _pp As ParameterInfo() = m.GetParameters()
Dim 参数 As ParameterInfo
For Each 参数 In _pp
Dim ooi As String = IIf(Not 参数.IsOut,"输入参数","输出参数")
result.Append("参数 " & 参数.Name & "【" & ooi & "】 参数类型 " & 参数.ParameterType.ToString & " " & vbCrLf)
Next
Next

Dim _property As PropertyInfo() = _type.GetProperties(flag)
Dim p As PropertyInfo
For Each p In _property
result.Append("属性 " & p.Name & vbCrLf)
Next


Dim _FieldInfo As FieldInfo() = _type.GetFields(flag)
Dim f As FieldInfo
For Each f In _FieldInfo
result.Append("字段 " & f.Name & vbCrLf)
Next


End If
Next
Me.RichTextBox1.Text = result.ToString
End Sub

Private Sub 反射来动态创建对象(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button4.Click
Dim asm As Assembly = Assembly.Load("Net反射机制") '使用程序集来查找
Dim _t As Type() = asm.GetTypes
Dim _type As Type
For Each _type In _t
If _type.Name = "ROBJ" Then
Dim p As Integer = 811221
Dim obj As Object = System.Activator.CreateInstance(_type,p)
Me.RichTextBox1.Text = obj.MyResult()
End If
Next

End Sub

Private Sub 反射来动动态调用方法(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button5.Click Dim asm As Assembly = Assembly.Load("Net反射机制") '使用程序集来查找 Dim _t As Type() = asm.GetTypes Dim _type As Type For Each _type In _t If _type.Name = "ROBJ" Then Dim p As Integer = 811221 Dim obj As Object = System.Activator.CreateInstance(_type,p) Dim m As MethodInfo = _type.getmethod("Add") Dim result As Integer = m.Invoke(obj,New Object() {1,33}) Me.RichTextBox1.Text = result End If Next End Sub End Class

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...