Per chiamare un indexer via reflection basta utilizzare in modo opportuno il metodo InvokeMember sul tipo di classe specifica.
Immaginiamo di avere un indexer di tipo object che utilizza come indice una stringa.
public class IndexerExample
{
...
public object this[string indexer]
{
get {...}
set {...}
}
...
}
Per chiamare l'Indexer è sufficiente passare il valore "Item" come PropertyName al metodo InvokeMember.
private void TestIndexerByReflection()
{
double numPI = 3.141592654;
IndexerExample example = new IndexerExample();
//Utilizzando l'oggetto di tipo IndexerExample
example["numPI"] = num3;
Console.WriteLine(example["numPI"]);
//Utilizzando la reflection
Type type = typeof (IndexerExample);
//example["numPI"] = numPI;
type.InvokeMember("Item", BindingFlags.SetProperty,
null, example,
new object[] {"numPI", numPI});
//dobule numPIReaded = example["numPI"];
double numPIReaded =
(double) type.InvokeMember("Item",
BindingFlags.GetProperty, null,
example, new object[] {"numPI"});
Console.WriteLine(numPIReaded);
}
Perciò è sufficiente ricordarsi che il nome utilizzato dal compilatore per generare le funzioni corrispondenti all'indexer è Item ed il gioco è fatto.