我只是为了好奇而测试反射的东西而我正在尝试调用私有方法,但我找不到它,因为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
答案 0 :(得分:4)
BindingFlags
值Public
和NonPublic
不是互斥的。每个人只是意味着具有该访问级别的成员将被包括在搜索中。如果您想在搜索中同时包含公开会员和非公开会员,则只需添加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