我只是测试反映事情的好奇心,我尝试调用私有方法,但我找不到它,因为是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
该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
文章来源: How to invoke a non-public method through Reflection without worrying about the method visibility?