我使用一个名为toolSystem的嵌套有序字典将工具存储到类别和子类型中。toolSystem.add正在添加类别和gardeningTools.add正在添加该类别的子类型(例如toolSystem具有gardeningTools类别和lineTrimer的子类型,lineTrimer是工具类的数组(。
OrderedDictionary toolSystem = new OrderedDictionary();
OrderedDictionary gardeningTools = new OrderedDictionary();
ToolCollection lineTrimmers = new ToolCollection(0);
Tool newTool = new Tool("Hose", 1, 1);
toolSystem.Add("Gardening Tools", gardeningTools);
gardeningTools.Add("Line Trimmers", lineTrimmers);
ToolSystem
有一个名为add
的方法,它具有以下签名:
public void add(Tool tool);
我遇到的问题是,我需要向lineTrimmers
字典添加一个新的Tool
实例,但我的方法作用域只能访问toolSystem
字典,所以我不能直接使用lineTrimmers
引用。
是否仍然可以使用按索引添加。例如toolSystem[0][0].add(newTool);
?
我试过使用这个:
toolSystem["Gardening Tools"]["Line Trimmers"].Add(newTool);
但这导致了以下错误:
"object"不包含"Add"的定义,并且找不到接受"object"类型的第一个参数的可访问扩展方法"Add"(是否缺少using指令或程序集引用?(
您已经尝试使用字符串访问字典中的元素,使用类型化集合,这种语法可以工作,但问题是OrderedDictionary
是非类型化的,因此元素的值被类型化为Object
,因此您需要对其进行强制转换才能使用特定的索引器逻辑:
下面是一个简单的尝试,它显式地将各个元素强制转换为我们假设它们是的类型:
OrderedDictionary gardeningTools = (OrderedDictionary)toolSystem["Gardening Tools"];
ToolCollection lineTrimmers = (ToolCollection)gardeningTools["Line Trimmers"];
lineTrimmers.Add(newTool);
您可以将其作为单行执行:
(((OrderedDictionary)toolSystem["Gardening Tools"])["Line Trimmers"] as ToolCollection).Add(newTool);
OrderedDictionary
有两个索引器可以用来直接寻址字典中的项,上面的例子是使用Object
类型的索引器,您可以以相同的方式使用整数索引器,
Item[Int32]返回
Object
获取或设置指定索引处的值。Item[Object]返回
Object
获取或设置具有指定键的值。
在许多使用对象类型集合的情况下,我们这样做是因为我们希望改变每个单独元素的类型,如果这些元素都是相同的类型,我们通常会使用泛型或强类型集合。
我们应该避免养成显式强制转换值的习惯,因为它会在运行时抛出异常,我们现在可以使用类型测试模式匹配来检查特定类型,并在同一表达式中乐观地强制转换值:
if (toolSystem["Gardening Tools"] is OrderedDictionary gardeningTools)
{
if (gardeningTools["Line Trimmers"] is ToolCollection lineTrimmers)
{
lineTrimmers.Add(newTool);
}
}
这仍然可以简化为几乎一行:
if (toolSystem["Gardening Tools"] is OrderedDictionary gardeningTools
&& gardeningTools["Line Trimmers"] is ToolCollection lineTrimmers)
lineTrimmers.Add(newTool);
如果你知道元素的索引,你也可以使用它们:
int categorieIndex = 0;
int subTypeIndex = 0;
if (toolSystem[categorieIndex] is OrderedDictionary categorie
&& categorie[subTypeIndex] is ToolCollection subType)
subType.Add(newTool);