如何以编程方式将元素添加到 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?的主要内容,如果未能解决你的问题,请参考以下文章

我可以以编程方式将元素添加到 XAML 吗? WPF c# [关闭]

检查视图元素是不是以编程方式添加到布局中

以编程方式将标签添加到 Swift 中的消息应用程序?

使用谷歌应用程序脚本以编程方式将脚注添加到谷歌文档中

以编程方式将 <br>-元素添加到跨度内的文本不会断行

如何以编程方式将新元素停靠到 DockPanel