以下のようなクラスがあったとして。
' 親クラス 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 続行するには何かキーを押してください . . .