Создание настраиваемой конфигурации с использованием.NET
Я пытаюсь создать типизированную конфигурацию, похожую на следующий фрагмент...
<logging application="Global Application Name">
<defaultLogger name="default" genericOption="XXX" specificOptionYYY="yyy" />
<defaultLogger name="notAsDefault" genericOption="AAA" specificOptionYYY="bbb" />
<anotherDefaultLogger name="anotherDefault" genericOption="ZZZ" specificOptionWWW="www" />
</logging>
В корне будет класс LoggerSettings, который будет содержать application
собственность и коллекция LoggingConfigurationElement
s.
Элемент LoggingConfigurationElement будет содержать genericOption
имущество. Затем будут созданы два конкретных подкласса, содержащие specificOptionYYY
а также specificOptionWWW
,
Как мне тогда пойти о сопоставлении и создании экземпляра правильного подкласса элемента конфигурации во время выполнения на основе имени элемента?
1 ответ
Хитрость была в том, чтобы переопределить OnDeserializeUnrecognizedElement
метод и динамически создать требуемый элемент конфигурации и десериализовать его вручную.
override protected bool OnDeserializeUnrecognizedElement (string elementName, System.Xml.XmlReader
{
if (sNames.ContainsKey (elementName))
{
var elementType = sNames[elementName];
if (elementType != null)
{
var element = Activator.CreateInstance (elementType) as LoggerConfigurationElement;
if (element != null)
{
element.DeserializeElementForConfig (reader, false);
BaseAdd (element);
}
}
return true;
}
return base.OnDeserializeUnrecognizedElement (elementName, reader);
}
В этом примере я предварительно построил список допустимых имен элементов, используя комбинацию отражения и конфигурации (да, больше конфигурации!), Поэтому я заранее знаю, является ли предоставленный элемент допустимым.