为什么 ConfigurationSection 需要使用字符串查找内容?

Why does ConfigurationSection need to look things up with a string?

我在网上找到的 ConfigurationSection 个例子 (for example) 都有这样的代码:

public class ConnectionSection  : ConfigurationSection
{
    [ConfigurationProperty("Servers")]
    public ServerAppearanceCollection ServerElement
    {
        get { return ((ServerAppearanceCollection)(base["Servers"])); }
        set { base["Servers"] = value; }
    }
}

为什么要使用方括号从基数访问值 "Servers"? setter 是从 xml 创建此对象时使用的,还是 setter 用于覆盖 xml 文件中的值?如果是这样,为什么要在此 属性 上设置属性?

Why is it accessing the value "Servers" from the base using the square brackets?

因为基础 class、ConfigurationSection 不知道其继承者将要实现的属性。

因此它公开了 a string indexer: this[string],使您可以访问从配置中读取的值。

这是设计决定。 .NET 团队也可以选择使用反射来获取和设置继承者的属性,但决定不这样做。 (好吧,当然在配置部分中有很多反思,但直到 public ServerAppearanceCollection ServerElement { get; set; } 可以工作为止)。

@CodeCaster 的回答的一点补充。
使用 C#6,您可以让生活更轻松:

class MyConfigSection : ConfigurationSection
{
    [ConfigurationProperty(nameof(SomeProperty))]
    public int SomeProperty
    {
        get { return ((int)(base[nameof(SomeProperty)])); }
        set { base[nameof(SomeProperty)] = value; }
    }
}

特别是,如果此代码块将变成代码片段。