Если вы ищете пользовательский раздел конфигурации, как следующий
<CustomApplicationConfig>
<Credentials Username="itsme" Password="mypassword"/>
<PrimaryAgent Address="10.5.64.26" Port="3560"/>
<SecondaryAgent Address="10.5.64.7" Port="3570"/>
<Site Id="123" />
<Lanes>
<Lane Id="1" PointId="north" Direction="Entry"/>
<Lane Id="2" PointId="south" Direction="Exit"/>
</Lanes>
</CustomApplicationConfig>
, то вы можете использовать мою реализацию раздела конфигурации так, чтобы начать работу добавить ссылку System.Configuration
сборки для вашего проекта
Посмотрите на каждый вложенный элемент, который я использовал, Первый - это учетные данные с двумя атрибутами, поэтому давайте сначала его добавим
Элемент учетных данных
public class CredentialsConfigElement : System.Configuration.ConfigurationElement
{
[ConfigurationProperty("Username")]
public string Username
{
get
{
return base["Username"] as string;
}
}
[ConfigurationProperty("Password")]
public string Password
{
get
{
return base["Password"] as string;
}
}
}
PrimaryAgent и SecondaryAgent
И имеет те же атрибуты, и, кажется, как Обращении к набору серверов для первичного и перехода на другой ресурс, так что вам просто нужно создать один класс элементов для обоих из них, как следующий
public class ServerInfoConfigElement : ConfigurationElement
{
[ConfigurationProperty("Address")]
public string Address
{
get
{
return base["Address"] as string;
}
}
[ConfigurationProperty("Port")]
public int? Port
{
get
{
return base["Port"] as int?;
}
}
}
Я объясню, как использовать два различных элемента с одним классом позже в этом посте, давайте пропустить SiteId, поскольку нет никакой разницы в этом. Вам просто нужно создать один класс, как указано выше, только с одним свойством. давайте посмотрим, как реализовать коллекцию Lanes
он расщепляется на две части первой вы должны создать класс реализации элемента, то вы должны создать класс элемент коллекции
LaneConfigElement
public class LaneConfigElement : ConfigurationElement
{
[ConfigurationProperty("Id")]
public string Id
{
get
{
return base["Id"] as string;
}
}
[ConfigurationProperty("PointId")]
public string PointId
{
get
{
return base["PointId"] as string;
}
}
[ConfigurationProperty("Direction")]
public Direction? Direction
{
get
{
return base["Direction"] as Direction?;
}
}
}
public enum Direction
{
Entry,
Exit
}
вы может заметить, что один атрибут LanElement
является перечислением, и если вы попытаетесь использовать любое другое значение в конфигурации, которое не определено в приложении Enumeration, то при запуске будет выбрано System.Configuration.ConfigurationErrorsException
. Хорошо давайте перейдем к коллекции Определение
[ConfigurationCollection(typeof(LaneConfigElement), AddItemName = "Lane", CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class LaneConfigCollection : ConfigurationElementCollection
{
public LaneConfigElement this[int index]
{
get { return (LaneConfigElement)BaseGet(index); }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
public void Add(LaneConfigElement serviceConfig)
{
BaseAdd(serviceConfig);
}
public void Clear()
{
BaseClear();
}
protected override ConfigurationElement CreateNewElement()
{
return new LaneConfigElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((LaneConfigElement)element).Id;
}
public void Remove(LaneConfigElement serviceConfig)
{
BaseRemove(serviceConfig.Id);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(String name)
{
BaseRemove(name);
}
}
вы можете заметить, что я установить AddItemName = "Lane"
вы можете выбрать все, что вы хотите для вашего пункта входа коллекции, я предпочитаю использовать «добавить» по умолчанию один, но я изменил его просто ради этого поста.
Теперь все наши вложенные элементы были реализованы теперь мы должны объединить всех тех, кто в классе, который должен реализовать System.Configuration.ConfigurationSection
CustomApplicationConfigSection
public class CustomApplicationConfigSection : System.Configuration.ConfigurationSection
{
private static readonly ILog log = LogManager.GetLogger(typeof(CustomApplicationConfigSection));
public const string SECTION_NAME = "CustomApplicationConfig";
[ConfigurationProperty("Credentials")]
public CredentialsConfigElement Credentials
{
get
{
return base["Credentials"] as CredentialsConfigElement;
}
}
[ConfigurationProperty("PrimaryAgent")]
public ServerInfoConfigElement PrimaryAgent
{
get
{
return base["PrimaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("SecondaryAgent")]
public ServerInfoConfigElement SecondaryAgent
{
get
{
return base["SecondaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("Site")]
public SiteConfigElement Site
{
get
{
return base["Site"] as SiteConfigElement;
}
}
[ConfigurationProperty("Lanes")]
public LaneConfigCollection Lanes
{
get { return base["Lanes"] as LaneConfigCollection; }
}
}
Теперь вы можете видеть, что у нас есть два свойства с именем PrimaryAgent
и SecondaryAgent
обе имеют одинаковый тип, теперь вы можете легко понять, почему у нас был только один класс реализации против этих двух элементов.
Прежде чем вы сможете использовать этот недавно разработанный раздел конфигурации в вашем приложении app.config (или web.config), вам просто нужно сообщить вам, что вы придумали свой собственный раздел конфигурации и принесите ему некоторое уважение, чтобы сделать это. добавить следующие строки в app.config (может быть сразу после начала корневого тега).
<configSections>
<section name="CustomApplicationConfig" type="MyNameSpace.CustomApplicationConfigSection, MyAssemblyName" />
</configSections>
Примечание: MyAssemblyName должен быть без .dll, например, если вы сборочный имя файла будет MyDLL.dll затем использовать MyDLL вместо MyDLL.dll
для получения этого использования конфигурации следующую строку кода где-либо в вашем приложении
CustomApplicationConfigSection config = System.Configuration.ConfigurationManager.GetSection(CustomApplicationConfigSection.SECTION_NAME) as CustomApplicationConfigSection;
Я надеюсь, что выше пост поможет вам начните с немного сложного рода пользовательских конфигурационных разделов.
Счастливый Coding :)
**** **** Редактировать Включение LINQ на LaneConfigCollection
вы должны реализовать IEnumerable<LaneConfigElement>
и добавить после внедрения GetEnumerator
public new IEnumerator<LaneConfigElement> GetEnumerator()
{
int count = base.Count;
for (int i = 0; i < count; i++)
{
yield return base.BaseGet(i) as LaneConfigElement;
}
}
для люди, которые все еще путаются о том, как доходность действительно работает. this nice article
Два ключевых пункта, взятых из вышеприведенной статьи:
Это действительно не завершает выполнение метода. return return приостанавливает выполнение метода и в следующий раз, когда вы его вызываете (для следующего значения перечисления ), метод будет продолжать выполняться с последнего обратного вызова . Это звучит немного запутанно, я думаю ... (Shay Friedman)
Выход не является отличительной чертой .Net runtime. Это всего лишь функция C# , которая скомпилирована в простой код IL компилятором C#. (Lars Corneliussen)
Я не могу получить эту работу. Мне бы хотелось увидеть RT.Core.Config.ServicesSection. Я просто получаю Unrecognized element 'AddService', несмотря на использование кода из принятого ответа. – sirdank
я пропустил это в первый тоже - эта часть: [ConfigurationCollection (TYPEOF (ServiceCollection), AddItemName = "добавить", ClearItemsName = "ясно", RemoveItemName = "удалить")] AddItemName должен соответствовать, так что если вам изменено «добавить» в «addService», это сработало бы – HeatherD