-4

我正在使用一个 API 来公开这样的覆盖

SuperAwesomeNinjaMethod(ItemToProcess item, ICollection itemProperties)
{

}

这一切都很好,花花公子,除了ICollection是一本字典。

我该如何使用它?我想我可以传入一个列表,但我想保留项目名称和项目值之间的关联,所以我不会神奇地从集合中挑选项目并将它们分配给item

[编辑]

抱歉,我的问题显然不清楚。我遇到的问题是,当调用层次结构中某处传递的对象是字典时,如何使用 ICollection。本质上,我不知道在这种情况下通过 ICollection 枚举将通过 KeyValuePair 对象的集合进行枚举。

4

4 回答 4

0

不知道你在这里问什么,但如果你需要这个方法来不同地处理字典,你可以测试看看是否ICollection也是IDictionary

if (itemProperties is IDictionary)
{
    // Dictionary specific code here.
    var itemPropertiesAsDictionary = itemProperties as IDictionary;
}
于 2012-06-06T16:09:18.533 回答
0

如果我正确理解了您的问题,您希望将其SuperAwesomeNinjaMethod与指定的签名一起使用,并且对于第二个参数,您希望传递 的实例System.Collections.Generic.Dictionary<TKey, TValue>,对吗?

该类Dictionary实现了ICollection接口,因此您可以只传递您的Dictionary实例。你会得到一个集合KeyValuePair<TKey, TValue>

于 2012-06-06T16:12:06.473 回答
0

问题是什么?您是否在问如何将字典传递给需要 ICollection 的方法?该方法是否需要将项目列表或字典转换为 ICollection?

在任何情况下Dictionary<>都实现了 ICollection ,因此您应该按原样传递它。如果要传递键或值,也可以使用KeysValues属性。他们都实现了ICollection。

以下调用将在没有任何类型转换的情况下成功:

        var dict = new Dictionary<string, string> {{"aKey", "aValue"}};
        var item = new ItemToProcess();

        SuperAwesomeNinjaMethod(item,dict);
        SuperAwesomeNinjaMethod(item, dict.Keys);
        SuperAwesomeNinjaMethod(item, dict.Values);
于 2012-06-06T16:12:45.130 回答
-2

您是否尝试过仅对字典进行类型转换?

SuperAwesomeNinjaMethod(ItemToProcess item, ICollection itemProperties)
{
    // Just pretending your dictionary is string, string...
    var myDictionary = (Dictionary<string string>)itemProperties;

    // ... carry on...

}

IDictionary如果您只需要合同,您也可以进行类型转换。

于 2012-06-06T16:12:52.520 回答