8

我有一个instance对象

instance.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>)

是真的。我的问题是,如何在不知道它们的泛型类型的情况下从该对象中提取键值对?我想得到类似的东西KeyValuePair<object, object>[]。请注意,我还知道字典在运行时(但不是编译时)使用的泛型类型。我认为需要某种反思?

跟进:是否有一种通用机制可以将一个转换objectSomeClass<>(当然,如果我知道这是正确的类型)并因此使用它,因为类的实现不受泛型参数类型的影响?

4

3 回答 3

7

我会按照 Jeremy Todd 所说的去做,只是可能会更短一点:

    foreach(var item in (dynamic)instance)
    {
       object key = item.Key;
       object val = item.Value;
    }

作为旁注(不确定是否有帮助),您可以获得如下参数的类型:

Type[] genericArguments = instance.GetType().GetGenericArguments();
于 2013-05-12T04:06:11.773 回答
5

对于快速解决方案,您可以使用dynamic

Dictionary<string, int> myDictionary = new Dictionary<string, int>();

myDictionary.Add("First", 1);
myDictionary.Add("Second", 2);
myDictionary.Add("Third", 3);

dynamic dynamicDictionary = myDictionary;

foreach (var entry in dynamicDictionary)
{
  object key = entry.Key;
  object val = entry.Value;
  ...whatever...
}
于 2013-05-12T03:43:30.393 回答
1

这就是我想出的帮助我的方法。它当时适合我的需要......也许它会帮助别人。

foreach (var unknown in (dynamic)savedState)
{
  object dKey = unknown.Key;
  object dValue = unknown.Value;

  switch (dKey.GetType().ToString())
  {
    case "System.String":
      //Save the key
      sKey = (string)dKey;

      switch (dValue.GetType().ToString())
      {
        case "System.String":
          //Save the string value
          sValue = (string)dValue;

          break;
        case "System.Int32":
          //Save the int value
          sValue = ((int)dValue).ToString();

          break;
      }

      break;
  }

  //Show the keypair to the global dictionary
  MessageBox.Show("Key:" + sKey + " Value:" + sValue);
}
于 2014-06-04T04:27:25.380 回答