1

我正在尝试创建一些类似于以下代码段的类型化配置...

<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属性。然后将创建两个包含specificOptionYYYand的特定子类specificOptionWWW

然后我将如何在运行时根据元素的名称匹配和实例化配置元素的正确子类?

4

1 回答 1

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);
}

在此示例中,我使用反射和配置的组合预先构建了有效元素名称列表(是的,更多配置!)所以我预先知道提供的元素是否是有效的。

于 2011-03-03T12:07:14.050 回答