2011-06-09 16 views
5

मैं किसी अन्य सिस्टम में संग्रहीत वृक्ष से मूल्यों को पुनर्प्राप्त करना चाहता हूं। उदाहरण के लिए:संकलित समय पेड़ संरचना

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

टाइपिंग त्रुटियों और अमान्य कुंजी से बचने के लिए, मैं इसे में एक वस्तु या वृक्ष संरचना के साथ वर्ग बनाने के द्वारा संकलन समय पर नाम की जांच करना चाहते हैं:

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

है वहाँ एक प्रत्येक पेड़ नोड के लिए कक्षाएं बनाये बिना सी # में ऐसा करने का आसान तरीका? क्या मैं अज्ञात कक्षाओं या उप-वर्गों का उपयोग कर सकता हूं? क्या मुझे कोड स्वचालित रूप से बनाना चाहिए?

+0

आप स्वचालित रूप से कोड बना सकते हैं (चाहिए) – sehe

+0

क्या आपका मतलब है कि यह कक्षा पदानुक्रम की तरह है? –

+0

हां, एक वर्ग पदानुक्रम। Oil.Color शायद कुंजी युक्त एक स्ट्रिंग होगा। – Sjoerd

उत्तर

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 और सीएल एक नाम स्थान Vehicle.Car.Ford में गधे)

0

आप शायद सी # विस्तार तरीकों के साथ यह करने के लिए एक तरह से पा सकते हैं: http://msdn.microsoft.com/en-us/library/bb383977.aspx

लेकिन वहाँ शायद कुछ स्वत: कोड पीढ़ी से बच है

1
  • आप प्रत्येक के लिए कक्षाएं बनाने के बिना ऐसा नहीं कर सकते पेड़ नोड
  • बेनामी प्रकार और/या सबक्लास यहां मदद नहीं करेंगे (कम से कम मैं नहीं देख सकता)
  • आप कक्षाएं स्वचालित रूप से जेनरेट कर सकते हैं, आपको इसके लिए कोड जनरेटर लिखना होगा, या एक का उपयोग करना होगा में विद्यमान जी 0 जैसे t4 या CodeSmith। आपको अपनी कक्षाओं को उत्पन्न करने के तरीके को बताने के लिए अभी भी एक मौजूदा कोड जेनरेटर के साथ कुछ कोड लिखना होगा।
1

इस तरह की कुछ बात का प्रयास करें:।

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

अब आप Intellisence के साथ प्रत्येक मूल्य मिल सकता है।

हालांकि मैं @ डीटीबी दृष्टिकोण पसंद करता हूं। फिर भी मुझे लगता है कि मेरा दृष्टिकोण काफी हल्का वजन है।