Создание настраиваемой конфигурации с использованием .NET - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь создать некоторую типизированную конфигурацию, похожую на следующий фрагмент ...

<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 Ответ

2 голосов
/ 03 марта 2011

Уловка состояла в том, чтобы переопределить метод 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);
}

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

...