Создание настраиваемой конфигурации с использованием.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 собственность и коллекция LoggingConfigurationElements.

Элемент 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);
}

В этом примере я предварительно построил список допустимых имен элементов, используя комбинацию отражения и конфигурации (да, больше конфигурации!), Поэтому я заранее знаю, является ли предоставленный элемент допустимым.

Другие вопросы по тегам