PropertyInfo.GetValue/SetValueメソッドを使うとプロパティの値の取得・設定を行うことができます。 インデクサ(既定のプロパティ、引数を持つプロパティ)に対する値の設定・取得もこのメソッドで行います。
.NET Framework 4.0以前の場合、PropertyInfo.GetValue/SetValueメソッドでは引数objの他に引数indexも指定する必要があります。 この引数はプロパティがインデクサの場合にインデックスとして使用される値を指定するためのものです。 プロパティがインデクサでない場合は引数indexにnull
/Nothing
を指定します。
.NET Framework 4.5以降では引数indexを必要としないオーバーロードが用意されているため、インデクサではないプロパティではインデックスの指定を省略することができます。
PropertyInfoを使ってインデクサの値を取得・設定する場合は、インデックスを指定する必要がある以外はプロパティの場合と同様です。
ただし、C#では特に指定しない場合、インデクサの名前はデフォルトでItem
となりますが、IndexerName属性によって変更可能である点に注意してください。
using System;
using System.Reflection;
class C {
//[System.Runtime.CompilerServices.IndexerName("Item")]
public int this[int index] {
get { return arr[index]; }
set { arr[index] = value; }
}
private int[] arr = new int[2];
}
class Sample {
static void Main()
{
var inst = new C();
inst[0] = 42;
inst[1] = 0;
var t = inst.GetType();
// インデクサItemのPropertyInfoを取得する
var p = t.GetProperty("Item");
// インデクサのインデックス1に値3を設定する
p.SetValue(inst, 3, new object[] {1});
// インデクサからインデックス0と1の値を取得する
Console.WriteLine(p.GetValue(inst, new object[] {0}));
Console.WriteLine(p.GetValue(inst, new object[] {1}));
}
}
42 3
プロパティ・インデクサの参照の結果例外が発生した場合、例外はTargetInvocationExceptionにラップされた上でスローされます。 TargetInvocationExceptionから実際にスローされた例外を取得する方法については§.TargetInvocationException、TargetInvocationExceptionにラップせずにスローさせる方法については§.BindingFlags.DoNotWrapExceptionsを参照してください。