我声明了一个像这样的静态mainDict,
private static Dictionary<string, object> mainDict = new Dictionary<string, object>();
Dictionary<string, object> aSubDict = new Dictionary<string,object>();
mainDict.Add("StringA0Key", "StringValue");
mainDict.Add("StringA1Key", aSubDict);
如何检测值类型是字符串(StringValue)还是字典(aSubDict)
我需要检测值类型并循环到“aSubDict”,否则我只需打印“StringValue”。谢谢。
[更新]
感谢您的帮助,我用下面的更新代码结束了我的问题。
using System;
using System.Collections;
using System.Collections.Generic;
class Program
{
private static Dictionary<string, object> mainDict = new Dictionary<string, object>();
public static void Main()
{
Dictionary<string, object> aSubDict = new Dictionary<string, object>();
mainDict.Add("sA0Key", "sA0Value");
mainDict.Add("sA1Key", aSubDict);
aSubDict.Add("sSubKey","sSubValue");
foreach (string theKey in mainDict.Keys)
{
if (!ReferenceEquals(null, mainDict[theKey]) && (mainDict[theKey] is Dictionary<string, object>))
{
//Console.WriteLine("type of aSubDict");
foreach (string subKey in aSubDict.Keys)
{
if (!ReferenceEquals(null,aSubDict[subKey]) && aSubDict[subKey] is Dictionary<string, object>)
{
Console.WriteLine("type of Child Dict");
}
else if (!ReferenceEquals(null, aSubDict[subKey]) && (aSubDict[subKey] is string))
{
Console.WriteLine("subKey = {0}, subValue = {1}", subKey, aSubDict[subKey]);
}
}
}
else if (!ReferenceEquals(null, mainDict[theKey]) && (mainDict[theKey] is string))
{
// Console.WriteLine("type string");
Console.WriteLine("Key = {0}, Value = {1}", theKey, mainDict[theKey]);
}
}
}
}
答案 0 :(得分:4)
if (obj is IDictionary)
这是因为所有词典,即使是通用的,implement the IDictionary interface。
if (!ReferenceEquals(null, obj) && obj is IDictionary)
<强>更新强>
您要测试is IDictionary<string, object>
。可能子类字典因类型参数(如IDictionary<int,string>
)或任意数量的键/值类型组合而不同 - 这意味着它与编译器的类型不同。但是,如果您想将其视为loosley类型的字典,那么只需测试is IDictionary
并使用IDictionary members - 请注意这些成员采用对象引用。
Dictionary<string, int>
与Dictionary<int, object>
的类型不同(它们永远不会是同一类型)。但是两者都是已实现的类型IDictionary
- 这就是为什么IDictionary可能是您在这种情况下搜索的内容。
我已将代码的中间部分更新并修改为IDictionary,但我没有测试逻辑或尝试编译它...
using System.Collections;
using System.Collections.Generic;
...
if (!ReferenceEquals(null, kvp) && (kvp is IDictionary))
{
foreach (DictionaryEntry entry in aSubDict)
{
if (entry.Value is IDictionary)
{
Console.WriteLine("iDictionary found");
}
else
{
Console.WriteLine("SubKey = {0}, SubValue = {1}", entry.Key, entry.Value);
}
}
可能你需要修改逻辑,因为子字典在'parent'字典条目的.Key或.Value中,但这是一个开始。
答案 1 :(得分:2)
检查它是否实现了接口System.Collections.IDictionary
if (mainDict["StringA1Key"] is IDictionary)
{
}
答案 2 :(得分:1)
如果您的目标是检测mainDict 中给定字典KevValue对的 值 是否属于确切类型 < / strong> ofSubDict:ie:一个字典,其键是Type字符串,值是Type对象:
Type testType = aSubDict.GetType();
foreach (string theKey in mainDict.Keys)
{
if ((mainDict[theKey]).GetType() == testType)
{
Console.WriteLine("Match found");
}
}
如果您的目标是检测mainDict 中给定字典KevValue对的 值 是否为实例 aSubDict:
foreach (string theKey in mainDict.Keys)
{
if (mainDict[theKey] == aSubDict)
{
Console.WriteLine("Match found");
}
}
让我们用一个完整的例子来解决这个问题,该例子过滤了'仅限类型且不使用GetType():
foreach (string theKey in mainDict.Keys)
{
if(mainDict[theKey] is Dictionary<string, object>)
{
Console.WriteLine("type of aSubDict");
} else if (mainDict[theKey] is string)
{
Console.WriteLine("type string");
}
}
以上针对FrameWork 3.5编译的Visual Studio Beta 2010 beta 2中测试的所有代码(不是“客户端模式”3.5,完整的monte)。