C#检查原语和字符串

时间:2019-03-06 08:31:10

标签: c#

我有以下方法在逐步遍历json时以递归方式替换所有键和值:

   private static void ReplaceKeyValue(IDictionary<string, object> dictionary, dynamic keys)
    {
        foreach (dynamic item in keys)
        {
            if (dictionary.ContainsKey(item.Key))
            {
                dictionary.Add(item.Value, dictionary[item.Key]);
                dictionary.Remove(item.Key);

                var nextItem = dictionary[item.Value];
                Type type = nextItem.GetType();
                if (type != typeof(string) && !type.IsPrimitive)
                {
                    if (dictionary[item.Value].Count > 0)
                    {
                        ReplaceKeyValue(nextItem, keys);
                    }
                }
            }
        }
    }

代码必须检查nextItem是否有任何子代,然后再次替换所有子代,如果没有,则退出。一旦代码进入json的第二层,我在其中只有几个项只有字符串和整数值,它将进入类型检查步骤,然后出现错误:

$exception  {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'string' does not contain a definition for 'Count'

我也尝试检查GenericType和GenericTypeDefinition,但无济于事。请告知最好的检查方法是什么?我缺少简单的东西吗?

编辑:进行澄清。 正如我所说的,我正在循环ovr一个已经被JSON.net反序列化的json对象。我强制转换为IDictionary,因为值类型是未知的并且可以是任何值,因此我需要检查类型并相应地进行处理。如果它有孩子,那么我也需要遍历他们并做同样的事情。这些项目可以深几个级别。

编辑2:

我解决了。

我只需要添加一个步骤来检查ExpandoObject,这样我就不必检查Count并自动将字符串的类型从string转换为String(我认为没有区别?)。这是最后一块:

                if (nextItem is ExpandoObject)
                {
                    ReplaceKeyValue(nextItem, keys);
                }
                else {
                    Type type = nextItem.GetType();
                    if (type != typeof(String) && !type.IsPrimitive)
                    {
                        if (nextItem.Count > 0)
                        {
                            ReplaceKeyValue(nextItem, keys);
                        }
                    }
                }

0 个答案:

没有答案