5

別のシステムに保存されているツリーから値を取得したい。例えば:

GetValue("Vehicle.Car.Ford.Focus.Engine.Oil.Color")

入力エラーや無効なキーを回避するために、ツリー構造を含むオブジェクトまたはクラスを作成して、コンパイル時に名前を確認したいと思います。

GetValue(Vehicle.Car.Ford.Focus.Engine.Oil.Color)

各ツリーノードのクラスを作成せずにC#でこれを行う簡単な方法はありますか?匿名のクラスまたはサブクラスを使用できますか?コードを自動的に作成する必要がありますか?

4

4 に答える 4

4

コンパイル時のチェックが必要な場合は、何らかの方法でコンパイル時の構成を使用して構造を定義する必要があります。T4テキストテンプレートを使用して、ツリー構造からコードを自動的に生成できます。

私が考えることができる可能な方法:

ネストされた静的クラス

public static class Vehicle
{
    public static class Car
    {
        public static class Ford
        {
            public static class Focus
            {
                public static class Engine
                {
                    public static class Oil
                    {
                        public static readonly string Color =
                            "Vehicle.Car.Ford.Focus.Engine.Oil.Color";
                    }
                }
            }
        }
    }
}

名前空間と静的クラス

namespace Vehicle.Car.Ford.Focus.Engine
{
    public static class Oil
    {
         public static readonly string Color =
             "Vehicle.Car.Ford.Focus.Engine.Oil.Color";
    }
}

Ford(名前空間にクラスと名前空間Vehicle.Carにクラスの両方を含めることはできないことに注意してくださいVehicle.Car.Ford。)

于 2011-06-09T08:06:32.257 に答える
1
  • ツリーノードごとにクラスを作成せずにこれを行うことはできません
  • 匿名のタイプやサブクラスはここでは役に立ちません(少なくとも私には方法がわかりません)
  • クラスは自動的に生成できます。そのためのコードジェネレーターを作成するか、t4CodeSmithなどの既存のクラスを使用する必要があります。クラスの生成方法を指示するために、既存のコードジェネレーターを使用しても、コードを作成する必要があります。
于 2011-06-09T08:06:21.570 に答える
1

このようなことを試してください:

var Vehicle = new { Car = new { Ford = new { Focus = new { Engine = new { Oil = new {Color = "Red"}}}}}};

これで、インテリジェンスを使用して各値を取得できます。

私は@dtbアプローチを好みますが。それでも私のアプローチはかなり軽量だと思います。

于 2011-06-09T08:14:21.293 に答える
0

おそらく、C#拡張メソッドを使用してそれを行う方法を見つけることができます:http://msdn.microsoft.com/en-us/library/bb383977.aspx

しかし、おそらくいくつかの自動コード生成から逃れることはできません

于 2011-06-09T08:02:29.823 に答える