[VB.NET] リフレクションで Private のメンバーにアクセスする

2013年12月1日

 以下のようなクラスがあったとして。

' 親クラス
Public MustInherit Class SuperClass
    Private _superClassField As Integer = 1

    Private Function superClassMethod(arg As String) As String
        Return "Super " & arg
    End Function
End Class

' 子クラス
Public Class SubClass
    Inherits SuperClass

    Private _subClassField As Integer = 2

    Private Function subClassMethod(arg As String) As String
        Return "Sub " & arg
    End Function
End Class

 このサブクラス側の Private メンバーにアクセスするには以下のようにします。
 具体的には、ターゲットのクラスを GetType し InvokeMember でアクセスします。

Dim target = New SubClass
Dim t = GetType(SubClass)

Dim value1 = t.InvokeMember("_subClassField",
                               Reflection.BindingFlags.GetField Or
                               Reflection.BindingFlags.Instance Or
                               Reflection.BindingFlags.NonPublic,
                            Nothing,
                            target,
                            Nothing)
Console.WriteLine(value1)

Dim value2 = t.InvokeMember("subClassMethod",
                               Reflection.BindingFlags.InvokeMethod Or
                               Reflection.BindingFlags.Instance Or
                               Reflection.BindingFlags.NonPublic,
                            Nothing,
                            target,
                            {"Args"})
Console.WriteLine(value2)

 結果

2
Sub Args
続行するには何かキーを押してください . . .

 継承元の Private メンバーにアクセスしたい場合は、GetType するクラスを、アクセスしたいメンバーがいるクラス名にします。
 今回の例だと、親クラスを指定して GetType します。

Dim target = New SubClass
Dim t = GetType(SuperClass)

Dim value1 = t.InvokeMember("_superClassField",
                               Reflection.BindingFlags.GetField Or
                               Reflection.BindingFlags.Instance Or
                               Reflection.BindingFlags.NonPublic,
                            Nothing,
                            target,
                            Nothing)
Console.WriteLine(value1)

Dim value2 = t.InvokeMember("superClassMethod",
                               Reflection.BindingFlags.InvokeMethod Or
                               Reflection.BindingFlags.Instance Or
                               Reflection.BindingFlags.NonPublic,
                            Nothing,
                            target,
                            {"Args"})

Console.WriteLine(value2)

 結果

1
Super Args
続行するには何かキーを押してください . . .





カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org