2010-07-17 16 views

उत्तर

25

अभिव्यक्ति पेड़ के साथ बहुत कुछ आम है (उदाहरण के लिए) AST। यह सीधे कोड पर मैप नहीं करता है, लेकिन एल्गोरिदम से निर्माण के लिए बहुत ही उपयुक्त है। उदाहरण के लिए, यदि आप एक सूत्र को पार्स कर रहे हैं:

((a + 2)/b) 

है जो:

ParameterExpression a = ..., b = ... 
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)), 
    b); 
var lambda = Expression.Lambda(body,a,b); // optionally with generics 

वास्तव में, मैं किया है वास्तव में यह एक पार्सर है कि एक वस्तु पेड़ का निर्माण का उपयोग कर, वस्तुओं पैदा करने के साथ एक "आगंतुक" कार्यान्वयन के माध्यम से पूर्ण विस्तार। .NET 4.0 में, समृद्ध अभिव्यक्ति-वृक्ष समर्थन अधिकांश परिदृश्यों का समर्थन करना संभव बनाता है, और इसे मांग पर संकलित करता है।

भाव का एक अन्य प्रमुख इस्तेमाल होता है कि आप उन्हें रनटाइम पर deconstruct कर सकते हैं, तो अपने कोड में आप हो सकता है:

Foo(x => x.SomeMethod(1, "abc")); 

और SomeMethod विधि-जानकारी, 1 और "abc" आदि निकालने


codedom कोड को मैप करता है। यह बयान आदि के बारे में है, बहुत इसी तरह आप नियमित कोड कैसे लिखेंगे। कोडेडॉम का सबसे आम उपयोग टूलिंग के हिस्से के रूप में कोड पीढ़ी के लिए है। आप इसे गतिशील संकलन के लिए उपयोग कर सकते हैं, लेकिन ईमानदार होने के लिए यह कठिन है। मैं एक प्रशंसक नहीं हूँ। अच्छी सुविधा यह है कि एक कोडेडॉम पेड़ कई भाषाओं के लिए काम कर सकता है।


एक अन्य दावेदार यहाँ DynamicMethod और/या ILGenerator होना चाहिए। यह एएसटी (अभिव्यक्ति) के लिए मानचित्र नहीं है, और इसका उपयोग स्रोत-कोड (कोडोडॉम) उत्पन्न करने के लिए नहीं किया जा सकता है, लेकिन एमएसआईएल उपकरणों तक पूर्ण पहुंच की अनुमति देता है। बेशक, यह भी आवश्यक है कि आप ढेर आदि के मामले में सोचें, लेकिन यह बहुत मेटा-प्रोग्रामिंग के लिए कुशल और प्रभावी है।


तो ILGenerator बहुत कठिन कोर है, और codedom, एक PITA है तो एक और विकल्प एक स्ट्रिंग के रूप में कोड के क्रम पीढ़ी है। फिर इसे संकलित करने के लिए CSharpCodeProvider के माध्यम से गुजरें। कोर रनटाइम के कुछ भाग हैं जो ऐसा करते हैं (XmlSerializer आईआईआरसी)।


तो संक्षेप में प्रस्तुत करने के लिए:

  • मेटा प्रोग्रामिंग: ILGenerator या CSharpCodeProvider; भी 4.0 में Expression (लेकिन यह काफी 3.5 में सीमित है)
  • निपटने एएसटी: कई भाषाओं में Expression
  • कोड पीढ़ी: कोड-डोम
Expression
  • कार्यावधि में पार्स करने
  • 0

    अभिव्यक्ति पेड़ अभिव्यक्तियों का निर्माण करने के लिए उपयोग किया जाता है। रनटाइम पर स्रोत कोड बनाना। कोडडॉम का उपयोग स्रोत कोड संकलित करने के लिए किया जाता है। इसे बनाने से पहले इसे अस्तित्व में रखना होगा। अभिव्यक्ति पेड़ अधिक लचीले होते हैं, लेकिन उपयोग करने के लिए बहुत कठिन है।

    यदि आप अपने आवेदन में स्क्रिप्टिंग जोड़ना चाहते हैं, तो कोडडॉम का उपयोग करें। यदि आप बहुत उन्नत प्रतिबिंब और पसंद करना चाहते हैं, तो अभिव्यक्ति पेड़ का उपयोग करें, लेकिन मैं इसकी अनुशंसा नहीं करता हूं।

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