2011-03-01 4 views
1

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

Как бы мне пойти по поводу соответствия и создания правильного подкласса элемента конфигурации во время выполнения на основе имени элемента?

ответ

2

Хитрость заключается в переопределении метода 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); 
} 

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

Смежные вопросы