使用反射获取泛型IDictionary的值 [英] Getting values of a generic IDictionary using reflection

查看:189
本文介绍了使用反射获取泛型IDictionary的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个实现 IDictionary< T,K> 的实例,我不知道编译时的T和K,并且想从中获取所有元素。我不想使用 IEnumerable ,这是由 IDictionary 实现的唯一非泛型接口。 。



代码到目前为止:

  //获取类型
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆