我正在使用一个暴露像这样的覆盖的API
SuperAwesomeNinjaMethod(ItemToProcess item, ICollection itemProperties)
{
}
除了ICollection
是字典之外,这一切都很好。
我如何使用它?我想我可以传入一个列表,但我想保留项目名称和项目值之间的关联,这样我就不会神奇地从集合中选择项目并将它们分配给项目。
[编辑]
我道歉,我的问题显然不清楚。我的问题是当在调用层次结构中的某个位置传递的对象是Dictionary时,如何使用ICollection。基本上我不知道在这种情况下通过ICollection进行的计算将枚举KeyValuePair对象的集合。
答案 0 :(得分:0)
不确定你在这里问的是什么,但是如果你需要这种方法来区别地处理字典,你可以测试ICollection
是否也是IDictionary
:
if (itemProperties is IDictionary)
{
// Dictionary specific code here.
var itemPropertiesAsDictionary = itemProperties as IDictionary;
}
答案 1 :(得分:0)
如果我正确理解了您的问题,您希望将SuperAwesomeNinjaMethod
与指定的签名一起使用,对于第二个参数,您希望传递System.Collections.Generic.Dictionary<TKey, TValue>
的实例,对吧?
Dictionary
类实现ICollection
接口,因此您只需传递Dictionary
实例即可。您将收到KeyValuePair<TKey, TValue>
答案 2 :(得分:0)
问题是什么?您是否在询问如何将字典传递给需要ICollection的方法?该方法是否需要一个项目列表或一个转换为ICollection的字典?
在任何情况下Dictionary<>都会实现ICollection,因此您不应该按原样传递它。如果您想传递密钥或值,也可以使用Keys和Values属性。它们都实现了ICollection。
以下调用将成功,无需进行任何类型转换:
var dict = new Dictionary<string, string> {{"aKey", "aValue"}};
var item = new ItemToProcess();
SuperAwesomeNinjaMethod(item,dict);
SuperAwesomeNinjaMethod(item, dict.Keys);
SuperAwesomeNinjaMethod(item, dict.Values);
答案 3 :(得分:0)
您是否尝试过对字典进行类型转换?
SuperAwesomeNinjaMethod(ItemToProcess item, ICollection itemProperties)
{
// Just pretending your dictionary is string, string...
var myDictionary = (Dictionary<string string>)itemProperties;
// ... carry on...
}
如果您需要的只是合同,您也可以转发IDictionary
。