2014-02-20 68 views
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 

回答

3

BindingFlagsPublicNonPublic不是相互排斥的。每一個只意味着具有該訪問級別的成員將被包括在搜索中。如果你想在搜索中包括公開和非公開的成員,那麼你只需包括BindingFlags值。

BindingFlags.InvokeMethod 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 
+0

謝謝,但我已經試過了,我仍然無法調用該方法,代碼是我」 m使用與我在我的問題中發表的相同,但只是用你所說的標誌。如果我將該方法設置爲public,則一切正常,那麼上面的私有方法的代碼有什麼問題? – ElektroStudios

+0

我上面的代碼(使用標誌)不工作了'Private','Friend','Protected'和'保護Friend'方法。 – ElektroStudios

+0

我更仔細地查看了你的代碼。您需要指定相應的BindingFlags當你調用GetMethod擺在首位:'Me.GetType()GetMethod( 「測試」,BindingFlags.Instance或者BindingFlags.Public或者BindingFlags.NonPublic)'。 – jmcilhinney

相關問題