我有一个应用程序,它读取单独应用程序的app.config。 app.config包含异构元素的集合。我正在构建的应用程序将生成一个显示app.config自定义部分的TreeView控件。除非我向下钻取并读取/显示自定义部分的内容,否则配置对象的Save()方法可以正常工作。我以this为例(也找到了here)。问题似乎是当我保存时(在查看之后,无论我是否对底层配置进行了更改),都会调用GetElementKey方法。这将返回元素集合的Key值。但是,此值将传递给CreateNewElement方法。这会导致问题,因为CreateNewElement会根据传入的elementName传回一个新类型。此时元素名称不会被传入,只传递键值。
我注意到的另一个奇怪的事情,就是通过几次单步执行代码,如果我没有从配置中读取值来构建UI来显示它们,那么我在每个元素中点击两次GetElementKey根本没有调用collection和CreateNewElement。当我显示值时会发生什么,GetElementKey的调用次数相同。然而,它返回并再次调用,然后使用键值调用CreateNewElement,如上所述。希望有人可以向我描述一下导致这一系列事件发生的情况。在将xml反序列化为配置对象时,是否需要更改属性?
这是我的app.config结构化方式:
<configuration>
<configSections>
<section name="section1" type="example" />
</configSections>
<section1>
<node1>
<elementA name="anElement" />
</node1>
<node2>
<add key="1" value="foo" />
</node2>
<node3>
<elementB>
<elementC name="anElement"/>
<elementD >
<elementE>
<foo name="foo1" />
<bar name="bar1" />
</elementE>
<elementF>
<elementG />
</elementF>
</elementD>
</elementB>
</section1>
</configuration>
问题与节点section1 / node3 / elementD / elementE中的集合有关。在“foo”和“bar”(每次2次)上调用GetElementKey后,再次调用它,并将“foo1”传递给CreateNewElement,这就是事情发生时。