【问题标题】:How to invoke a non-public method through Reflection without worrying about the method visibility?如何通过 Reflection 调用非公共方法而不用担心方法的可见性?
【发布时间】:2014-02-20 05:50:01
【问题描述】:

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

    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
    

    【讨论】:

    • 谢谢,但我已经尝试过了,但我仍然无法调用该方法,我使用的代码与我在问题中发布的代码相同,但只是带有你的标志'已经说过。如果我将方法设置为公开,那么一切正常,那么上面的私有方法代码有什么问题?
    • 我上面的代码(使用你的标志)不适用于 PrivateFriendProtectedProtected Friend 方法。
    • 我更仔细地查看了您的代码。首先调用 GetMethod 时需要指定适当的 BindingFlags:Me.GetType().GetMethod("Test", BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic).
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2011-01-30
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多