使用反射获取泛型IDictionary的值 [英] Getting values of a generic IDictionary using reflection
问题描述
我有一个实现 IDictionary< T,K>
的实例,我不知道编译时的T和K,并且想从中获取所有元素。我不想使用 IEnumerable
,这是由
代码到目前为止:
//获取类型
Type iDictType = instance.GetType()。GetInterface(IDictionary`2);
类型keyType = iDictType.GetGenericArguments()[0];
Type valueType = iDictType.GetGenericArguments()[1];
//获取键
IEnumerable键=(IEnumerable)dictType.GetProperty(Keys)
.GetValue(instance,null);
foreach(键中的对象键)
{
// ==>这不起作用:调用[]运算符
对象value = dictType.GetProperty(Item)
.GetValue(instance,new object [] {key});
//从TryGet获得另一个实例的值
MethodInfo tryGetValue = iDictType.GetMethod(TryGetValue);
object [] arguments = new object [] {key,null};
bool hasElement =(bool)tryGetValue.Invoke(otherInstance,arguments);
object anotherValue = arguments [1];
}
我也可以调用TryGetValue,但我认为应该可以调用[]运算符。任何人都可以帮助我吗?
TKey
/ TValue
,并通过 MakeGenericMethod
切换到常规代码 - 如下所示: (编辑) - 您也可以将 otherInstance
作为参数传递给它们)
静态类程序
{
static void Main()
{
object obj = new Dictionary< int,string> {
{123,abc},{456,def}};
foreach(类型iType在obj.GetType().GetInterfaces())
{
if(iType.IsGenericType&&& iType.GetGenericTypeDefinition()
== Typeof(IDictionary<,>))
{
typeof(Program).GetMethod(ShowContents)
.MakeGenericMethod(iType.GetGenericArguments())
.Invoke (null,new object [] {obj});
休息;
$ b public static void ShowContents< TKey,TValue>(
IDictionary< TKey,TValue> data)
{
foreach(var对中的数据)
{
Console.WriteLine(pair.Key +=+ pair.Value);
}
}
}
I have an instance that implements IDictionary<T, K>
, I don't know T and K at compiletime, and want to get all elements from it. I don't want to use IEnumerable
for some reason, which would be the only non-generic interface implemented by IDictionary
.
Code I have so far:
// 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];
}
I could also call TryGetValue, but I think it should be possible to call the [] operator. Can anybody help me?
It would be better to figure out the TKey
/ TValue
, and switch into regular code via MakeGenericMethod
- like so:
(edit - you could pass in the otherInstance
as an argument too, if they are of the same type)
static class Program
{
static void Main()
{
object obj = new Dictionary<int, string> {
{ 123, "abc" }, { 456, "def" } };
foreach (Type iType in obj.GetType().GetInterfaces())
{
if (iType.IsGenericType && iType.GetGenericTypeDefinition()
== typeof(IDictionary<,>))
{
typeof(Program).GetMethod("ShowContents")
.MakeGenericMethod(iType.GetGenericArguments())
.Invoke(null, new object[] { obj });
break;
}
}
}
public static void ShowContents<TKey, TValue>(
IDictionary<TKey, TValue> data)
{
foreach (var pair in data)
{
Console.WriteLine(pair.Key + " = " + pair.Value);
}
}
}
这篇关于使用反射获取泛型IDictionary的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!