0

私のコードに次のように定義されたクラスがあるとしましょう:

class test{
    bool var;
    public test(){}
}

メイン関数では、この種のオブジェクトを作成し、var を true に設定します。

その後、以下を含むいくつかの XML ファイルを解析します。

<param name="var" value="false"/>

var は false でなければならないことを読み、false に設定しました。

これは素晴らしいことですが、問題は保守性です。コード内の変数名を変更すると、すべての XML ファイルを変更する必要があるため、これを維持するのは大変なことのように思えます。

これを回避する簡単な方法はありますか?または、少なくともこれを維持する簡単な方法はありますか? 私が今思いつく唯一のことは、何らかの方法で XML および C# コードを編集するメタ スクリプトですが、これは多くの作業のようで、正直言って非常にハックです。

4

3 に答える 3

0

いくつかのオプションがあります:

  • XML ファイルの形式を制御しない場合は、XML の属性名からプロパティ名を読み取る配管コードを記述できます。それらが同じでなければならない技術的な理由はありません。

  • 実行時に XML ファイルを生成する場合は、リフレクションを使用してプロパティ名を取得し、それに応じて XML ファイルの属性名を設定できます。これらは常にこのように同期されます。

  • コンパイル時に XML ファイルを作成していて、Visual Studio ユーザーである場合は、T4 Templatesを調べることをお勧めします。これらは、一貫性があり、再利用可能で、厳密に型指定された方法でファイルを生成するための優れたツールです。

于 2013-06-06T04:29:04.043 に答える
0

以下のコード サンプルは、役に立つかもしれません。

XML で変数の「名前」と「値」を宣言する代わりに、.NET によって提供される XML シリアル化を使用して、XML を適切な変数に解析します。XML から「名前」を完全に削除するか、値の目的を明確に表現するためのデバイスに変えてください。以下の属性の代わりに要素 (より読みやすい) を使用するように XML を更新しました。

XML サンプル

<Test>
    <Params>
        <Param>
            <Name>Meaningful Parameter Name</Name>
            <Value>1</Value>
        </Param>
        <Param>
            <Name>Meaningful Parameter Name2</Name>
            <Value>0</Value>
        </Param>
    </Params>
</Test>

xml シリアライゼーションを使用して、XML 要素を変数に割り当てるのはコード内です。ご覧のとおり、Param クラスには文字列名とブール値が含まれ、XML 要素の「名前」と「値」から読み取られます。これにより、変数名を反映するために XML を更新することを心配することなく、変数名を変更できます。気が変わって XML の「Value」の名前を別の名前に変更したい場合は、XML で定義された新しい名前で[XmlElement("Value")]のコードを更新するだけで済みます。単純!:)

幸運を!

コード例

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            string testXML = @"<Test>
                                    <Params>
                                        <Param>
                                            <Name>Meaningful Parameter Name</Name>
                                            <Value>1</Value>
                                        </Param>
                                        <Param>
                                            <Name>Meaningful Parameter Name2</Name>
                                            <Value>0</Value>
                                        </Param>
                                    </Params>
                               </Test>";

            XDocument doc = XDocument.Parse(testXML);
            XmlSerializer serializer = new XmlSerializer(typeof (Test));
            Test testDeserialized = (Test) serializer.Deserialize(doc.CreateReader());

            foreach (Param param in testDeserialized.Params)
            {
                Console.WriteLine("Name: " + param.Name + ", Value: " + param.Value);
            }

            Console.ReadLine();
        }
    }

    [XmlRoot]
    public class Test
    {
        [XmlArray("Params")]
        [XmlArrayItem("Param", typeof (Param))]
        public Param[] Params { get; set; }
    }

    public class Param
    {
        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("Value")]
        public bool Value { get; set; }
    }
}
于 2013-06-06T04:53:54.877 に答える