如何以编程方式将元素添加到 ConfigurationElementCollection?
Posted
技术标签:
【中文标题】如何以编程方式将元素添加到 ConfigurationElementCollection?【英文标题】:How do I programmatically add elements to a ConfigurationElementCollection? 【发布时间】:2012-05-10 08:33:47 【问题描述】:我正在尝试对自定义 ConfigurationElementCollection
进行单元测试,但在以编程方式填充集合时遇到问题。当我调用BaseAdd()
时,我得到以下异常:
ConfigurationErrorsException : 元素 'add' 已被锁定在更高级别的配置中。
但是,此问题仅在运行多个测试时出现。考虑这两个测试:
private Fixture Fixtures = new Fixture(); // AutoFixtures
[Test]
public void test1()
var tc = Fixtures.CreateAnonymous<TenantCollection>();
var t = Fixtures.CreateAnonymous<Tenant>();
tc.Add(t);
[Test]
public void test2()
var tc = Fixtures.CreateAnonymous<TenantCollection>();
var t = Fixtures.CreateAnonymous<Tenant>();
tc.Add(t);
单独执行时,每个单独的测试都会通过。一起运行时,会抛出锁异常。
这里发生了什么?如何解锁收藏集或绕过该锁?
【问题讨论】:
【参考方案1】:我仍然不完全确定 ConfigurationElement
锁定是如何工作的,但我确实找到了一个至少对于单元测试来说似乎很好的解决方法:在添加新项目之前,将 LockItem
设置为 false。
所以在我的自定义 ConfigurationElementCollection
中,我有方法 Add()
(我在 OP 中调用它)。需要修改成这样:
public class TenantCollection : ConfigurationElementCollection
public void Add(Tenant element)
LockItem = false; // the workaround
BaseAdd(element);
【讨论】:
您也可以从 TenantCollection 实现中覆盖 IsReadOnly 方法并返回 false以上是关于如何以编程方式将元素添加到 ConfigurationElementCollection?的主要内容,如果未能解决你的问题,请参考以下文章