У меня есть экземпляр, который реализует IDictionary<T, K>
, я не знаю T и K в compiletime и хочу получить из него все элементы. По какой-то причине я не хочу использовать 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, но я думаю, что это должно быть возможно вызвать оператор []. Кто-нибудь может мне помочь?
Я не уверен, что я понимаю вопрос. Вы хотите использовать оператор [] вместо получения значения свойства Item через Reflection? – Andy
Пробовал это с помощью словаря, и попытка использовать indexer/get_Item работает для меня. –
Gishu
@ Andy: Оператор [] фактически вызывает свойство Item во время выполнения, что не отображается во время компиляции. @Gishu: как вы назвали индексатора? Нет ли свойства «Item», только метод get_Item? –