如何通过Reflection调用非公共方法而不必担心方法可见性?

问题描述 投票:1回答:1

我只是为了好奇而测试反射的东西,我试图调用私有方法,但我找不到它因为是Private

但我真正想知道的是,如果可以在反射搜索中自动检索方法的可见性,而不必担心调用的方法是私有的,共享的,朋友的,公共的......等等。 BindingFlags标志组合能够无差别地调用方法可见性的方法吗?我的意思是不用担心方法的可见性。

这是我的代码:

Public Class Form1

Private Shadows Sub Load() Handles MyBase.Load

    Dim Method As System.Reflection.MethodInfo = Me.GetType().GetMethod("Test")

    If Method IsNot Nothing Then
        Method.Invoke(Me, BindingFlags.InvokeMethod Or BindingFlags.NonPublic, Nothing,
                      New Object() {"Hello World!", Type.Missing}, CultureInfo.InvariantCulture)
    Else
        MsgBox("Method not found or maybe is not public.")
    End If

End Sub

Private Sub Test(ByVal Value As String, Optional ByVal Value2 As Integer = 1)
    MsgBox(Value)
End Sub

End Class
.net vb.net reflection methods invoke
1个回答
4
投票

BindingFlagsPublicNonPublic不是相互排斥的。每个人只是意味着具有该访问级别的成员将被包括在搜索中。如果要在搜索中包含公共成员和非公共成员,则只需包含两个BindingFlags值。

BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic

这是我刚刚测试并发现工作的一个简单示例:

Imports System.Reflection

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim obj As New Test
        Dim objType = obj.GetType()
        Dim method1 = objType.GetMethod("Method1", BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
        Dim method2 = objType.GetMethod("Method2", BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)

        method1.Invoke(obj, Nothing)
        method2.Invoke(obj, Nothing)
    End Sub

End Class


Public Class Test

    Public Sub Method1()
        MessageBox.Show("Public")
    End Sub

    Private Sub Method2()
        MessageBox.Show("Private")
    End Sub

End Class
© www.soinside.com 2019 - 2024. All rights reserved.