Уловка состояла в том, чтобы переопределить метод 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);
}
В этом примере я предварительно создал список допустимых элементовимена, использующие комбинацию отражения и конфигурации (да, больше конфигурации!), поэтому я заранее знаю, является ли предоставленный элемент допустимым.