vb.net反射机制 反射教程

来源:互联网 发布:软件设计师认证机构 编辑:程序博客网 时间:2024/06/01 10:31

 

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

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

原创粉丝点击