代码之家  ›  专栏  ›  技术社区  ›  TGnat

如何在web.config文件中存储Dictionary对象?

  •  62
  • TGnat  · 技术社区  · 16 年前

    我想在我的web配置文件中存储一个简单的键/值字符串字典。Visual Studio使存储字符串集合(参见下面的示例)变得容易,但我不确定如何使用字典集合。

            <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
              <string>value1</string>
              <string>value2</string>
              <string>value2</string>
            </ArrayOfString>
    
    5 回复  |  直到 12 年前
        1
  •  118
  •   javamonkey79    12 年前

    为什么要重新发明轮子?这个 AppSettings 节的目的正是在配置文件中存储类似字典的数据。

    如果不想在AppSettings部分放置太多数据,可以将相关值分组到各自的部分,如下所示:

    <configuration>
      <configSections>
        <section 
          name="MyDictionary" 
          type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
    
      <MyDictionary>
         <add key="name1" value="value1" />
         <add key="name2" value="value2" />
         <add key="name3" value="value3" />
         <add key="name4" value="value4" />
      </MyDictionary>
    </configuration>
    

    可以使用访问此集合中的元素

    using System.Collections.Specialized;
    using System.Configuration;
    
    public string GetName1()
    {
        NameValueCollection section =
            (NameValueCollection)ConfigurationManager.GetSection("MyDictionary");
        return section["name1"];
    }
    
        2
  •  26
  •   Factor Mystic    14 年前

    朱丽叶的答案是对的,但仅供参考,你也可以在外部添加配置 .config 文件,通过设置 web.config 如下:

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <!-- blah blah the default stuff here -->
    
        <!-- here, add your custom section -->
        <section name="DocTabMap" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
    
      <!-- your custom section, but referenced in another file -->
      <DocTabMap file="CustomDocTabs.config" />
    
      <!-- etc, remainder of default web.config is here -->
    </configuration>
    

    然后,你的 CustomDocTabs.config 如下所示:

    <?xml version="1.0"?>
    <DocTabMap>
      <add key="A" value="1" />
      <add key="B" value="2" />
      <add key="C" value="3" />
      <add key="D" value="4" />
    </DocTabMap>
    

    现在,您可以通过以下方式通过代码访问它:

    NameValueCollection DocTabMap = ConfigurationManager.GetSection("DocTabMap") as NameValueCollection;
    DocTabMap["A"] // == "B"
    
        3
  •  5
  •   Maxime Rouiller    16 年前

    您需要实现一个自定义部分(请参见 Configuration Section Designer )

    你真正想要的…是否与此接近:

    <MyDictionary>
      <add name="Something1" value="something else"/>
      <add name="Something2" value="something else"/>
      <add name="Something3" value="something else"/>
    </MyDictionary>
    

    其中,xmltattribute“name”是一个键,它不允许在代码后面有多个键。同时,确保集合myDictionary也是一个字典。

    您可以使用此工具完成所有这些操作,并根据需要填充间隙。

        4
  •  3
  •   christo    13 年前

    在应用程序设置中,我们可以使用System.Collection.Specialized.StringCollection

    <X.Properties.Settings>
      <setting name="ElementsList" serializeAs="Xml">
        <value>
          <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <string>Element1</string>
            <string>Element2</string>
          </ArrayOfString>
        </value>
      </setting>
    </X.Properties.Settings>
    

    访问列表:

    var element = Settings.Default.ElementsList[index]
    
        5
  •  0
  •   JaredPar    16 年前

    我不知道如何直接存储字典,但您可以轻松地使用字符串数组来存储字典。对于每个键,值对将键保存为第一个字符串,值保存为第二个字符串。然后在重建字典时,您可以撤消此编码。

    static Dictionary<string,string> ArrayToDictionary(string[] data) {
      var map = new Dictionary<string,string>();
      for ( var i=  0; i < data.Length; i+=2 ) {
        map.Add(data[i], data[i+1]);
      }
      return map;
    }