【问题标题】:How do you load a dictionary into a console application from an app.config?如何从 app.config 将字典加载到控制台应用程序中?
【发布时间】:2011-03-31 19:05:08
【问题描述】:

我想在我的控制台应用程序启动时从我的 app.config 加载字典。

我知道我可以使用 xml 库或 linq to XML 来加载它以解析和遍历它。我的问题是有一种内置的方法。

难道没有办法将应用程序配置部分添加到 app.config 中,然后使用 System.Configuration 命名空间中的 ConfigurationManager 类自动加载它吗?

有什么例子吗?顺便说一句,我在 NET20 中。

编辑
对不起,我应该澄清一下。我想在不使用 AppSettings 的情况下加载字典。我已经知道该怎么做了。当然,使用 AppSettings 的缺点是我必须更改我的代码才能将新值添加到我的字典中。这就是为什么我正在寻找一种自动执行此操作的方法。

【问题讨论】:

  • 您可以通过单击标签下的小编辑链接将其添加到您的问题中
  • 通行权,您已准备好超越 System.Configuration 的范围。欢迎加入群。
  • 我认为你是对的。我猜会推出我自己的配置。

标签: c# .net vb.net configuration


【解决方案1】:

您需要将<appSettings> 部分添加到您的 app.config 文件中。它看起来像:

<appSettings>
    <add key="foo" value="fooValue" />
    <add key="bar" value="barValue" />
    <add key="baz" value="bazValue" />
 </appSettings> 

在您的应用程序中,您可以使用System.Configuration.ConfigurationManager.AppSettings 获取这些值,这是一个NameValueCollection,本质上是一个从字符串到字符串的字典。

string myFoo = System.Configuration.ConfigurationManager.AppSettings["foo"];

【讨论】:

  • Mystagogue 的解决方案可能更像是你之后的样子。 .NET 配置 API 非常广泛。 IMO 它设计过度且复杂,但很有可能在里面可以找到您需要的任何东西。我更喜欢只使用 appSettings 之类的东西,因为我在这里很少需要,而且标准的 NameValueCollection 实现非常灵活。您始终可以使用NameValueCollection.AllKeys 以编程方式获取所有密钥,并非常轻松地将所有这些转储到Dictionary&lt;string, string&gt;
【解决方案2】:

您可以按照您描述的方式使用 appSettings 部分,但是该部分很容易被各种需求所污染,因此我通常会避免使用它。您可以制作自定义部分来处理这个问题。

假设您有一个名为“PluginSpec”的类,您可以编写如下代码:

[ConfigurationCollection(typeof(PluginSpec), AddItemName = "Plugin",
    CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class PluginCollection : ConfigurationElementCollection
{
    //This collection is potentially modified at run-time, so
    //this override prevents a "configuration is read only" exception.
    public override bool IsReadOnly()
    {
        return false;
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new PluginSpec();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        PluginSpec retVal = element as PluginSpec;
        return retVal.Name;
    }

    public PluginSpec this[string name]
    {
        get { return base.BaseGet(name) as PluginSpec; }
    }

    public void Add(PluginSpec plugin){
        this.BaseAdd(plugin);
    }
}

上面的代码可以从另一个配置类的成员中使用,像这样:

    [ConfigurationProperty("", IsDefaultCollection = true)]
    public PluginCollection Plugins
    {
        get
        {
            PluginCollection subList = base[""] as PluginCollection;
            return subList;
        }
    }

以上将是派生自 ConfigurationElement 或 ConfigurationSection 的类中的成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2015-01-21
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多