2011-06-09 54 views
5

我想從存儲在另一個系統中的樹中檢索值。例如:編譯時間樹結構

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

避免輸入錯誤和無效的鍵,我想通過它創建一個對象或類樹結構,以檢查在編譯時的名字:

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

是否有簡單的方法來在C#中做到這一點,而無需爲每個樹節點創建類?我可以使用匿名類或子類嗎?我應該自動創建代碼嗎?

+0

你可以(應該)自動創建代碼 – sehe 2011-06-09 07:59:51

+0

你的意思是說,這就像一個類層次結構? – 2011-06-09 08:00:16

+0

是的,一個類層次結構。 Oil.Color可能是一個包含密鑰的字符串。 – Sjoerd 2011-06-09 08:06:08

回答

4

如果你想編譯時檢查,你需要用某種方式使用編譯時結構來定義你的結構。您可以使用T4 text template自動從樹結構中生成代碼。

我能想到的可能途徑:

嵌套靜態類

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

(請注意,你不能同時擁有命名空間Vehicle.Car和cl中的Ford類驢在命名空間Vehicle.Car.Ford

1
  • 你離不開每個創建類做到這一點樹節點
  • 匿名類型和/或子類在這裏沒有幫助(至少我看不出)
  • 您可以自動生成類,您需要爲它編寫代碼生成器,或者使用存在於例如t4CodeSmith。即使使用現有的代碼生成器,您仍然需要編寫一些代碼來告訴它如何生成類。
1

嘗試一些像這樣的事情:

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

現在,你可以得到intellisence每個值。

雖然我更喜歡@dtb方法。不過,我認爲我的方法非常輕。