私はIDictionary<T, K>
を実装するインスタンスを持っています。私はコンパイル時にTとKを知らず、そこからすべての要素を取得したいと思います。何らかの理由でIEnumerable
を使用したくない場合は、IDictionary
で実装されている唯一の非ジェネリックインターフェイスです。私がこれまで持って反射を使って汎用IDictionaryの値を取得する
コード:
// getting types
Type iDictType = instance.GetType().GetInterface("IDictionary`2");
Type keyType = iDictType.GetGenericArguments()[0];
Type valueType = iDictType.GetGenericArguments()[1];
// getting the keys
IEnumerable keys = (IEnumerable)dictType.GetProperty("Keys")
.GetValue(instance, null);
foreach (object key in keys)
{
// ==> this does not work: calling the [] operator
object value = dictType.GetProperty("Item")
.GetValue(instance, new object[] {key });
// getting the value from another instance with TryGet
MethodInfo tryGetValue = iDictType.GetMethod("TryGetValue");
object[] arguments = new object[] { key, null };
bool hasElement = (bool)tryGetValue.Invoke(otherInstance, arguments);
object anotherValue = arguments[1];
}
は、私はまた、TryGetValueを呼び出すことができますが、私は[]演算子を呼び出すことが可能であるべきだと思います。誰か助けてくれますか?
私は質問を理解しているかどうかはわかりません。 Reflectionを介してItemプロパティの値を取得する代わりに、[]演算子を使用しますか? – Andy
ディクショナリでこれを試し、インデクサ/ get_Itemの使用を試みました。 –
Gishu
@Andy:[]演算子は、実行時にItemプロパティを実際に呼び出します。これはコンパイル時には表示されません。 @ Gishu:どのようにインデクサーに電話しましたか?プロパティ 'Item'はありません。メソッド 'get_Item'だけですか? –