PropertyInfo.GetValue/SetValueメソッドを使うとプロパティの値の取得・設定を行うことができます。 インデクサ(既定のプロパティ、引数を持つプロパティ)に対する値の設定・取得もこのメソッドで行います。

.NET Framework 4.0以前の場合、PropertyInfo.GetValue/SetValueメソッドでは引数objの他に引数indexも指定する必要があります。 この引数はプロパティがインデクサの場合にインデックスとして使用される値を指定するためのものです。 プロパティがインデクサでない場合は引数indexnull/Nothingを指定します。

.NET Framework 4.5以降では引数indexを必要としないオーバーロードが用意されているため、インデクサではないプロパティではインデックスの指定を省略することができます。

PropertyInfoを使ってインデクサの値を取得・設定する場合は、インデックスを指定する必要がある以外はプロパティの場合と同様です。

ただし、C#では特に指定しない場合、インデクサの名前はデフォルトでItemとなりますが、IndexerName属性によって変更可能である点に注意してください。

PropertyInfoを使ってインデクサの値を取得・設定する
Imports System
Imports System.Reflection

Class C
  Public Default Property Item(ByVal index As Integer) As Integer
    Get
      Return arr(index)
    End Get
    Set(ByVal value As Integer)
      arr(index) = value
    End Set
  End Property

  Private arr(1) As Integer
End Class

Class Sample
  Shared Sub Main()
    Dim inst As New C()

    inst(0) = 42
    inst(1) = 0

    Dim t As Type = inst.GetType()

    ' インデクサItemのPropertyInfoを取得する
    Dim p As PropertyInfo = t.GetProperty("Item")

    ' インデクサのインデックス1に値3を設定する
    p.SetValue(inst, 3, New Object() {1})

    ' インデクサからインデックス0と1の値を取得する
    Console.WriteLine(p.GetValue(inst, New Object() {0})) ' inst(0)
    Console.WriteLine(p.GetValue(inst, New Object() {1})) ' inst(1)
  End Sub
End Class
実行結果
42
3

プロパティ・インデクサの参照の結果例外が発生した場合、例外はTargetInvocationExceptionにラップされた上でスローされます。 TargetInvocationExceptionから実際にスローされた例外を取得する方法については§.TargetInvocationException、TargetInvocationExceptionにラップせずにスローさせる方法については§.BindingFlags.DoNotWrapExceptionsを参照してください。