Способ добавления пользовательской конфигурации (если вам требуется больше, чем просто типы) заключается в использовании 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. Как вы можете видеть, он представляет элементы «пользователя» в вашей конфигурации, которую вы предоставили.
Класс 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="[email protected]" />
<user firstName="Jane" lastName="Doe" email="[email protected]" />
</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 = "[email protected]";
userInfoSection.Users.Add( userElement );
userConfig.Save();
Вышеприведенный код при необходимости создаст новый файл user.config, спрятанный глубоко внутри папки «Local Settings\Application Data» для пользователя.
Если вместо этого вы хотите добавить нового пользователя в файл app.config, просто измените параметр метода OpenExeConfiguration() на ConfigurationUserLevel.None.
Как видите, это довольно просто, хотя для поиска этой информации потребовалось немного покопаться.
person
Timothy Walters
schedule
16.04.2009