2011-06-09 19 views
5

Başka bir sistemde depolanmış bir ağaçtan değerler almak istiyorum. Örneğin: yazım hatası ve geçersiz anahtarları önlemek içinDerleme zamanı ağaç yapısı

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

, içinde ben ağaç yapısı ile bir nesneyi veya sınıfı yaratarak derleme zamanında adını kontrol etmek istiyorum:

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

mi var bir Her ağaç düğümü için sınıf oluşturmadan bunu C# yapmanın kolay yolu? Anonim sınıfları veya alt sınıfları kullanabilir miyim? Kodu otomatik olarak oluşturmalı mıyım?

+0

Kodu otomatik olarak oluşturabilir (yapmalı) – sehe

+0

Bunu sınıf hiyerarşisi gibi mi demek istiyorsunuz? –

+0

Evet, bir sınıf hiyerarşisi. Oil.Color muhtemelen anahtarı içeren bir dize olurdu. – Sjoerd

cevap

4

Derleme zamanı denetimi istiyorsanız, derleme zamanı yapıları kullanarak yapınızı bir şekilde tanımlamanız gerekir. Ağaç yapısından otomatik olarak kod oluşturmak için T4 text template'u kullanabilirsiniz. Aklıma

Olası yolları:

İçiçe statik sınıflar

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

İsim alanları ve statik sınıflar

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

(Hem CSV olamaz unutmayın Vehicle.Car adında sınıf Ford ve cl Bir ad Vehicle.Car.Ford içinde değerlendirmek)

1
  • Her biri için sınıflar yaratmadan bunu yapamaz var ağaç düğümü
  • Anonim tür ve/veya alt sınıflar burada yardımcı olmaz (en azından nasıl göremiyorum)
  • Sınıfları otomatik olarak oluşturabilirsiniz, bunun için bir kod üreteci yazmanız veya bir existin g gibi bir t4 veya CodeSmith. Sınıflarınızı nasıl üreteceğinizi anlatmak için mevcut bir kod üreteci ile bile bazı kodları yazmanız gerekecektir.
1

bu gibi bazı şey deneyin:.

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

Şimdi intellisence ile her değeri elde edebilirsiniz.

@dtb yaklaşımını tercih etmeme rağmen. Yine de benim yaklaşımımın oldukça hafif olduğunu düşünüyorum.