我有一个有趣的问题。我需要编写一个通用(我会使用“泛型”这个词,但这会与我所追求的相冲突)例程,我可以处理一个字典对象实例的实例并将所述对象的内容作为字典迭代并将内容作为文字值返回。困难在于方法参数将是“对象”类型,而不是字典。
我现在需要的,无法弄清楚如何做,是一种迭代Dictionary<K, V>
任意键和值的方法。如果你知道进入的类型很容易,但正如我所说,字典的起源将是object.GetType()。GetInterfaces()在结果中有typeof(IDictionary)的对象。我不会知道(也不应该知道)字典键类型或值类型。
我目前的需求是处理Dictionary<string, SomeClass>
;的内容。一旦我得到了密钥列表,我可以在每个实例上使用foreach,找出它是一个字符串并从那里继续。使用Values它将是某个类的一个实例(该类将会改变,但是我可以将其传递给另一组方法来提取类,提取类的属性并提取这些值)。
请求的要点是获取一个方法(或两个或多个),它允许我迭代未知类型的字典并提取键和值,所有这些都在编译时不知道类型。上面的词典;只是一个例子,我需要能够传递任何字典。目前,我并不担心像Dictionary<Tuple<int, string, SomeOtherClass>, SomeClass>>
这样的边缘情况或类似的情况,如果我可以从Dictionary<string, SomeClass>;
开始,我可以从那里开始。
它正在以我可以处理的形式获取密钥和值,但我还没知道该怎么做。
答案 0 :(得分:1)
您提到您可以访问对象上的IDictionary<K,V>
界面。然后,您可以使用get_Keys
和get_Values
分别访问密钥和值。
此外,IDictionary<K,V>
派生自IEnumerable<KeyValuePair<K,V>>
,因此您还可以使用类似于列表的for循环访问键值对列表。
编辑 - 澄清:
IDictionary inputAsDictionary = input as IDictionary;
if (inputAsDictionary != null)
{
// Valid : input is a dictionary.
ICollection dictKeys = inputAsDictionary.Keys; // This is a list of all keys
ICollection dictValues = inputAsDictionary.Values; // This is a list of all values
// Iterate over all keys
for(var dictKey in dictKeys)
{
Console.WriteLine(dictKey); // Print the key
Type dictKeyType = dictKey.GetType(); // Get the type of key if required
// ...
}
// Similarly, iterate over all values
for(var dictValue in dictValues)
{
Console.WriteLine(dictValue); // Print the value
Type dictValueType = dictValue.GetType(); // Get the type of value if required
// ...
}
}
您也可以使用通用Dictionary<K,V>
接口执行此操作,但获取类型会变得更加复杂。您需要致电Type.GenericTypeArguments并从那里开始。我展示的例子似乎更简单。