我正在尝试创建一些类似于以下代码段的类型配置...
<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
的特定子类。
然后我如何根据元素的名称在运行时匹配和实例化配置元素的正确子类?
答案 0 :(得分: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);
}
在这个例子中,我使用反射和配置的组合预先构建了有效元素名称列表(是的,更多配置!)所以如果提供的元素是有效元素我就知道了。