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

时间:2014-02-20 05:50:01

标签: .net vb.net reflection methods invoke

我只是为了好奇而测试反射的东西而我正在尝试调用私有方法,但我找不到它,因为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

1 个答案:

答案 0 :(得分: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