Как мне сохранить объект словаря в моем файле web.config?
Я хотел бы сохранить простой словарь ключ / значение строки в моем файле веб-конфигурации. 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 ответов
Зачем изобретать велосипед? Раздел 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"];
}
Джульетта ответ на вопрос, но, к вашему сведению, вы можете также добавить дополнительные конфиги во внешний .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"
Вам нужно будет реализовать пользовательский раздел (см. Конфигуратор раздела конфигурации).
То, что вы действительно хотите... что-то близко к этому:
<MyDictionary>
<add name="Something1" value="something else"/>
<add name="Something2" value="something else"/>
<add name="Something3" value="something else"/>
</MyDictionary>
Где "имя" XmlAttribute - это ключ, который не позволяет иметь более одного кода в коде. В то же время убедитесь, что коллекция MyDictionary также является словарем.
Вы можете сделать все это с помощью этого инструмента и заполнить пробел по мере необходимости.
В настройках приложения мы можем использовать System.Collection.Specilized.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]
Я не уверен, как хранить словарь напрямую, но вы можете легко использовать массив строк для хранения словаря. Для каждой пары ключ-значение вы сохраняете ключ в качестве первой строки, а значение - в качестве второй. Затем при восстановлении словаря вы можете отменить эту кодировку.
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;
}