Способ добавления настраиваемой конфигурации (если вам требуется больше, чем просто простые типы) - это использовать ConfigurationSection, в рамках которого для определенной вами схемы вам понадобится ConfigurationElementCollection (установленный как коллекция по умолчанию без имени), который содержит ConfigurationElement , следующим образом:
public class UserElement : ConfigurationElement
{
[ConfigurationProperty( "firstName", IsRequired = true )]
public string FirstName
{
get { return (string) base[ "firstName" ]; }
set { base[ "firstName" ] = value;}
}
[ConfigurationProperty( "lastName", IsRequired = true )]
public string LastName
{
get { return (string) base[ "lastName" ]; }
set { base[ "lastName" ] = value; }
}
[ConfigurationProperty( "email", IsRequired = true )]
public string Email
{
get { return (string) base[ "email" ]; }
set { base[ "email" ] = value; }
}
internal string Key
{
get { return string.Format( "{0}|{1}|{2}", FirstName, LastName, Email ); }
}
}
[ConfigurationCollection( typeof(UserElement), AddItemName = "user", CollectionType = ConfigurationElementCollectionType.BasicMap )]
public class UserElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new UserElement();
}
protected override object GetElementKey( ConfigurationElement element )
{
return ( (UserElement) element ).Key;
}
public void Add( UserElement element )
{
BaseAdd( element );
}
public void Clear()
{
BaseClear();
}
public int IndexOf( UserElement element )
{
return BaseIndexOf( element );
}
public void Remove( UserElement element )
{
if( BaseIndexOf( element ) >= 0 )
{
BaseRemove( element.Key );
}
}
public void RemoveAt( int index )
{
BaseRemoveAt( index );
}
public UserElement this[ int index ]
{
get { return (UserElement) BaseGet( index ); }
set
{
if( BaseGet( index ) != null )
{
BaseRemoveAt( index );
}
BaseAdd( index, value );
}
}
}
public class UserInfoSection : ConfigurationSection
{
private static readonly ConfigurationProperty _propUserInfo = new ConfigurationProperty(
null,
typeof(UserElementCollection),
null,
ConfigurationPropertyOptions.IsDefaultCollection
);
private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();
static UserInfoSection()
{
_properties.Add( _propUserInfo );
}
[ConfigurationProperty( "", Options = ConfigurationPropertyOptions.IsDefaultCollection )]
public UserElementCollection Users
{
get { return (UserElementCollection) base[ _propUserInfo ]; }
}
}
Я сохранил класс UserElement простым, хотя он действительно должен следовать шаблону объявления каждого свойства полностью, как описано в этой превосходной статье CodeProject . Как видите, он представляет элементы user в вашей конфигурации, которую вы указали.
Класс UserElementCollection просто поддерживает наличие более одного «пользовательского» элемента, включая возможность добавлять / удалять / удалять элементы из коллекции, если вы хотите изменить ее во время выполнения.
Наконец, существует UserInfoSection, который просто сообщает, что у него есть набор по умолчанию "пользовательских" элементов.
Далее приведен пример файла App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup>
<section
name="userInfo"
type="ConsoleApplication1.UserInfoSection, ConsoleApplication1"
allowDefinition="Everywhere"
allowExeDefinition="MachineToLocalUser"
/>
</sectionGroup>
</configSections>
<userInfo>
<user firstName="John" lastName="Doe" email="John.Doe@company.com" />
<user firstName="Jane" lastName="Doe" email="Jane.Doe@company.com" />
</userInfo>
</configuration>
Как видите, в этом примере я включил некоторые элементы userInfo / user в App.config. Я также добавил настройки, чтобы они могли быть определены на уровне компьютера / приложения / пользователя / пользователя роуминга.
Далее нам нужно знать, как их обновлять во время выполнения, следующий код показывает пример:
Configuration userConfig = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.PerUserRoamingAndLocal );
var userInfoSection = userConfig.GetSection( "userInfo" ) as UserInfoSection;
var userElement = new UserElement();
userElement.FirstName = "Sample";
userElement.LastName = "User";
userElement.Email = "Sample.User@company.com";
userInfoSection.Users.Add( userElement );
userConfig.Save();
Приведенный выше код создаст новый файл user.config, если это необходимо, и находится глубоко внутри папки «Local Settings \ Application Data» для пользователя.
Если вместо этого вы хотите, чтобы новый пользователь был добавлен в файл app.config, просто измените параметр метода OpenExeConfiguration () на ConfigurationUserLevel.None.
Как видите, это достаточно просто, хотя для поиска этой информации нужно немного покопаться.