2009-09-15 18 views
5

के माध्यम से मूल्य हो रही है मुझे पता करना चाहते हैं तो यह कुछ इस तरह करना संभव नहीं है:सी #: प्रतिबिंब

:

class brand 
{ 
    string name; 
} 

class car 
{ 
    string carname; 
    brand carbrand; 
} 

अब मैं इस तरह एक स्ट्रिंग और प्रकार कार का एक instantiated वस्तु मिल गया है

car carobject = new car(); 
string brandNameOfCar = DoSomeMagicalReflectionStuff(car, "car.brand.name"); 

"DoSomeMagicalReflectionStuff" विधि कैसा दिखता है?

और यह भी तरह कुछ करने के लिए संभव है:

car carobject = new car(); 
string brandNameOfCar = DoSomeMagicalReflectionStuff(car, "car.brand.name.ToFormatedString()"); 

धन्यवाद!

+0

आप carobject.carbrand.name का उपयोग क्यों नहीं करते? –

+3

क्योंकि यह सिर्फ एक बेवकूफ उदाहरण है और "असली एप्लिकेशन" में मैं –

+0

जैसी किसी भी इकाई तक पहुंचने की लचीलापन चाहता हूं, मैं इस तरह कुछ "templating" करना चाहता हूं और केवल स्पष्ट इकाई-सूचनाओं तक पहुंच प्राप्त करने की आवश्यकता है ऊपर की तरह स्ट्रिंग। –

उत्तर

1

मैं आमतौर पर उत्पादों मैं में शामिल कर रहा हूँ प्लग करने का प्रयास नहीं है, लेकिन यह एक आदर्श समस्या Vici Parser द्वारा हल किया जा करने के लिए (.NET के लिए खुला स्रोत अभिव्यक्ति पार्सर) है:

var parser = new CSharpParser(); 
var context = new CSharpContext(); 

context["car"] = carobject; 

string brandNameOfCar = 
      parser.Evaluate<string>("car.brand.name.ToFormatedString()", context); 
+0

अच्छा लगता है, धन्यवाद! –

+1

यदि आप मुझसे पूछते हैं तो .net के bcl के साथ आसानी से कार्यान्वित कुछ के लिए एक ओवरकिल –

+1

@Rune: आप वास्तव में कारणों को नहीं जानते हैं कि वह स्ट्रिंग में संग्रहीत अभिव्यक्तियों का मूल्यांकन करने वाले कुछ क्यों चाहते हैं। मैं व्यक्तिगत रूप से बहुत ही सरल डीएसएल समाधान बनाने के लिए गतिशील अभिव्यक्ति का उपयोग करता हूं। –

0

typeof (कार) .GetProperty ("ब्रांड", bindingflags.instance | bindingflags.private) .GetValue (carobject, null) ऐसा होना चाहिए। नाबालिग वाक्यविन्यास त्रुटियों के लिए Sry मेरे फोन पर im थोड़ा

संपादित करें: इसके बाद के संस्करण आप ब्रांड वस्तु देंगे और आप करते हैं एक ही नाम संपत्ति

4

मैं यह परीक्षण नहीं किया पाने के लिए कर सकते हैं, लेकिन यहाँ है कुछ है जो काम करना चाहिए:

class brand 
{ 
    public string name; 
} 

class car 
{ 

    public car(string s) 
    { 
     Match match = Regex.Match(s, @"(?<carname>[^\.]+)\.(?<brandname>.+)"); 
     if (match.Success) 
     { 
      this.carname = match.Groups["carname"].Value; 
      this.carbrand = new brand(); 
      this.carbrand.name = match.Groups["brandname"].Value; 
     } else 
     { 
      throw new ArgumentException("Not a valid car"); 
     } 
    } 

    string carname; 
    brand carbrand; 

    public override string ToString() 
    { 
     return carname + "." + carbrand.name; 
    } 
} 

बुद्धि:

car c = new car(); 
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c); 
string result = (val as brand).ToFormattedString(); 
0

इसे और अधिक फ़ायदेमंद होगा कार के एक निर्माता है कि एक पैरामीटर के रूप में एक स्ट्रिंग लेता है और निम्नलिखित की तरह कुछ करता है करने के लिए एच निम्नलिखित उपयोग:

car c = new car("M5.BMW"); 
Console.WriteLine(c.ToString()); 

आप इसे एक पार्स और TryParse विधि में अलग कर सकते हैं।

+1

वाह, किसी को आपके कीबोर्ड धारक लाइसेंस से दूर ले जाना चाहिए! एक स्ट्रिंग क्यों? इसे पार्स क्यों कर रहे हैं? 2 तर्क क्यों नहीं? o_O –

+0

क्योंकि सवाल एक स्ट्रिंग में गुज़र रहा था, उदाहरण के लिए यदि यह कहीं से एक फाइल को पार्स कर रहा था जिसमें कई कारें थीं। –

+0

हालांकि आपके पक्ष में, मानक के पास एक स्ट्रिंग के साथ एक कन्स्ट्रक्टर नहीं है, बल्कि इसके बजाय एक पार्स विधि है। –

संबंधित मुद्दे