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>

applicationルートには、プロパティとのコレクションを含むLoggerSettingsクラスがありますLoggingConfigurationElement

LoggingConfigurationElementにはgenericOptionプロパティが含まれます。specificOptionYYY次に、とを含む2つの特定のサブクラスが作成され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 に答える