Якщо ви шукаєте спеціальний розділ конфігурації, як описано нижче
<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;
}
}
}
Первинний агент та вторинний агент
Обидва мають однакові атрибути і схожі на Адреса до набору серверів для первинного та перехідного режиму, тому вам просто потрібно створити один клас елементів для обох таких, як наступний
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, оскільки в ньому немає різниці. Вам просто потрібно створити один клас, як і вище, лише з одним властивістю. давайте подивимося, як реалізувати колекцію доріжок
він розділений на дві частини. Спочатку потрібно створити клас реалізації елементів, а потім створити клас елементів колекції
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
- це Перерахування, і якщо ви спробуєте використати будь-яке інше значення в конфігурації, яке не визначено в додатку Перерахування, буде 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 (можливо, одразу після початку тегу root).
<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;
Я сподіваюсь, що вищезгаданий пост допоможе вам розпочати роботу зі складним видом спеціальних розділів конфігурації.
Щасливе кодування :)
**** Редагувати **** Щоб увімкнути 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;
}
}
для людей, які все ще плутаються з приводу того, як справді працює врожай, прочитайте цю приємну статтю
Дві ключові моменти, взяті з наведеної статті
це насправді не закінчує виконання методу. return return призупиняє виконання методу, і наступного разу, коли ви викликаєте його (для наступного значення перерахунку), метод буде продовжувати виконуватись з останнього виклику зворотного виходу. Думаю, це звучить трохи заплутано ... (Шей Фрідман)
Вихід не є особливістю виконання .Net. Це лише функція мови C #, яка компілюється компілятором C # у простий код ІЛ. (Ларс Корнеліуссен)