C# 从未知类型的字典中获取键和值列表,而不使用动态

C# 从未知类型的字典中获取键和值列表,而不使用动态,c#,dictionary,C#,Dictionary,我正在尝试将字典转换为键值对,这样我就可以对它进行一些特殊的解析,并以字符串格式存储它。我使用的是Unity,所以我不能使用dynamic关键字。这是我的设置 我有一个类,我正在迭代它的属性,操作它们的值,并将它们放入一个新的字典中。问题是,如果不使用动态技巧,我不知道如何从我不知道其类型的字典中获取键和值。有什么想法吗?我将需要做同样的列表 Type t = GetType(); Dictionary<string, object> output = new Dic

我正在尝试将字典转换为键值对,这样我就可以对它进行一些特殊的解析,并以字符串格式存储它。我使用的是Unity,所以我不能使用dynamic关键字。这是我的设置

我有一个类,我正在迭代它的属性,操作它们的值,并将它们放入一个新的字典中。问题是,如果不使用动态技巧,我不知道如何从我不知道其类型的字典中获取键和值。有什么想法吗?我将需要做同样的列表

    Type t = GetType();
    Dictionary<string, object> output = new Dictionary<string, object>();
    foreach(PropertyInfo info in t.GetProperties())
    {
        object o = info.GetValue(this, null);
        if(info.PropertyType.GetGenericTypeDefinition() == typeof(Dictionary<,>))
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            foreach(object key in o) //not valid
            {
                object val = DoSomething(o[key]);//not valid
                output[key] = val;
            }
        }
        else if(info.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
        {

        }
    }
    return output;
Type t=GetType();
字典输出=新字典();
foreach(t.GetProperties()中的PropertyInfo信息)
{
对象o=info.GetValue(这个,null);
if(info.PropertyType.GetGenericTypeDefinition()==typeof(字典))
{
字典d=新字典();
foreach(对象键在o中)//无效
{
object val=DoSomething(o[key]);//无效
输出[键]=val;
}
}
else if(info.PropertyType.GetGenericTypeDefinition()==typeof(列表))
{
}
}
返回输出;
字典
还实现了非泛型的
IDictionary
接口,因此您可以使用该接口:

IDictionary d = (IDictionary) o;
foreach(DictionaryEntry entry in d)
{
    output[(string) entry.Key] = entry.Value;
}
请注意,如果密钥类型不是
string
,则此操作显然会失败。。。尽管您可以调用
ToString
,而不是强制转换

实际上,您可以轻松地检查任何
IDictionary
实现,而不仅仅是
Dictionary
,甚至无需进行讨厌的反射检查:

IDictionary dictionary = info.GetValue(this, null) as IDictionary;
if (dictionary != null)
{
    foreach (DictionaryEntry entry in dictionary)
    {
        output[(string) entry.Key] = entry.Value;
    }
}

谢谢你的快速回答!让我试试,看看是否有效。有些东西在IOS上无法正常工作,而其他的则无法正常工作。我会回来报到的。它可能要到周一才会出现我认为应该是output[(string)entry.Key]=d[entry.Key]@user2292539:不完全正确-应该是
output[(string)entry.Key]=entry.Value-当我们已经获得带有值的条目时,不需要按键查找它。我已经修正了我的答案。所以在考虑了一段时间后,我不知道为什么我不首先使用序列化来处理我想要的内容,但这仍然是一件值得学习的事情。