1

xml ベースの構成ファイル (app.config ではない) をロードするプログラムを作成しています。

この構成ファイルでは、プログラムによってインスタンス化して構成する必要がある型を指定します。

これが私がこれをどのように想像するかの例です:

<?xml version="1.0"?>
<configuration>
    <types>
        <type assembly="SomeAssembly.dll" class="SomeAssembly.SomeClass">
            <type-configuration>
               <address>192.168.0.1</address>
               <port>80</port>
            </type-configuration>
        </type>
    </types>
</configuration>

その最も内側の要素が問題です<type-configuration>。そこに含まれる要素は、 が必要とする特定の構成に依存しSomeAssembly.SomeClass、プログラムにはまったく「認識」されません。

新しいタイプを追加すると、その部分は次のようになります。

<type assembly="SomeAssembly.dll" class="SomeAssembly.SomeClass">
    <type-configuration>
       <address>192.168.0.1</address>
       <port>80</port>
    </type-configuration>
</type>
<type assembly="SomeOtherAssembly.dll" class="SomeOtherAssembly.SomeOtherClass">
    <type-configuration>
       <url>http://www.domain.com/path/to/webpage</url>
       <authentication-token>1234567890ABC</authentication-token>
    </type-configuration>
</type>

上記の XML ファイルを厳密に型指定されたオブジェクトに逆シリアル化し、そのサブ XML 部分を保持して、型自体がそれを独自のオブジェクトに逆シリアル化できるようにする方法はありますか?

すなわち。私のプログラムの構成クラスは次のようになります。

[XmlType("configuration")]
public class Configuration
{
    [XmlElement("types")]
    public Collection<SubType> Types
    {
        ...
    }
}

[XmlType("type")]
public class SubType
{
    [XmlElement("configuration")]
    public ??? Configuration { get; set; }
}

SubType.Configurationそのプロパティを宣言するにはどうすればよいですか? それは可能ですか?

最終的に、そのプロパティにあるデータは、構成ファイルで指定されたタイプのインスタンス化されたオブジェクトに与えられることに注意してください。その部分はまだ書いていないので、うまくいくものならなんでもいいのですが、

これは、私が何を望んでいるのか、そしてどこまで到達したのかを示す完全なLINQPadプログラムです。

void Main()
{
    const string xml = @"<?xml version=""1.0""?>
<configuration>
    <types>
        <type assembly=""SomeAssembly.dll"" class=""SomeAssembly.SomeClass"">
            <type-configuration>
            <address>192.168.0.1</address>
            <port>80</port>
            </type-configuration>
        </type>
        <type assembly=""SomeOtherAssembly.dll"" class=""SomeOtherAssembly.SomeOtherClass"">
            <type-configuration>
            <url>http://www.domain.com/path/to/webpage</url>
            <authentication-token>1234567890ABC</authentication-token>
            </type-configuration>
        </type>
    </types>
</configuration>";

    var serializer = new XmlSerializer(typeof(Configuration));
    using (var reader = new StringReader(xml))
    {
        var configuration = (Configuration)serializer.Deserialize(reader);
        configuration.Dump();
    }
}

[XmlType("configuration")]
public class Configuration
{
    private readonly Collection<SubType> _Types = new Collection<SubType>();

    [XmlArray("types")]
    public Collection<SubType> Types
    {
        get
        {
            return _Types;
        }
    }
}

[XmlType("type")]
public class SubType
{
    private readonly Collection<XmlNode> _Configuration = new Collection<XmlNode>();

    [XmlAttribute("assembly")]
    public string AssemblyName { get; set; }

    [XmlAttribute("class")]
    public string ClassName { get; set; }

    [XmlElement("type-configuration")]
    public Collection<XmlNode> Configuration
    {
        get
        {
            return _Configuration;
        }
    }
}

SubTypeこれにより 2 つのオブジェクトがダンプされますが、Configurationプロパティにはパーツの最初のサブ要素のみが含まれます<type-configuration>...</type-configuration>。プロパティ タイプを に変更するstringと、最も内側のテキストのみが表示されます。IPアドレスまたはURLを変更するとXmlDocumentXmlNode.

4

1 に答える 1