2010-02-26 21 views
16

मैं कुछ कोड है कि System.Linq.Expressions और Expression.Lambda<Func<>>.Compile() आदि का उपयोग कर मैं बाद में उपयोग के लिए एक विधानसभा में उत्पन्न कार्यों को क्रमानुसार करने में सक्षम होना चाहते हैं विभिन्न Func<> प्रतिनिधियों उत्पन्न करता है मिल गया है। अतीत में मैंने सिस्टम के साथ कुछ सामान किया है। रिफ्लेक्शन। स्वीकार करें लेकिन अब लिंक अभिव्यक्तियां मैं उस मार्ग को फिर से नहीं जाना चाहूंगा।मैं एक सिस्टम को कैसे हटा सकता हूं। Linq.Expression?

क्या नेमस्पेस से Emit नामस्थान में एक संकलित अभिव्यक्ति या किसी प्रकार का पुल क्रमबद्ध करने के लिए कोई तंत्र है?

संपादित

संदर्भ के लिए कुछ पृष्ठभूमि: मैं एक प्रश्न इंजन पर काम कर रहा हूँ (ज्यादातर अपने ही उन्नति और आनंद के लिए)। एक SQL विवरण मैं पार्स करने के लिए है और यह एक लैम्ब्डा समारोह में बदलना और फिर बाद में (और दोहराया निष्पादन) के लिए डिस्क के लिए यह क्रमानुसार चाहेंगे देखते हुए।

छद्म कोड में मैं इस मुद्दे पर हूँ:

Func<IEnumerable<T>, IEnumerable<T1>> query = Query.Parse<T, T1>("Select field AS A, field1 AS B from T where T.field2 > 5"); 

(जहां क्षेत्र, फ़ील्ड 1 और field2प्रकार टी और एक और बी गुण हैं की संपत्ति हैं प्रकार T1 के। और मैं <T>करने के किसी भी शुमार पारित कर सकते हैंऔर वापस पाने और जो क्वेरी मापदंड से मेल खाने <T1> के गणन।

तो मैं एक पहले से ही संकलित विधानसभा के रूप में डिस्क पर query क्रमानुसार करने तो एक बाद की तारीख में मैं पार्स करने और यह संकलन के बिना यह <T> के विभिन्न सेट लोड और मूल्यांकन कर सकते हैं करना चाहते हैं। मैं की तर्ज पर कुछ चित्र कर रहा हूँ:

AssemblyBuilder builder = new AssemblyBuilder(...); 
ModuleBuilder module = builder.DefineDynamicModule(...); 
TypeBuilder type = module.DefineType(...); 
type.AddMethod(query); // <--- where this piece does not exist as far as I know 
builder.Emit(...) 

उत्तर

3

मुझे यकीन क्या वास्तव में अपने व्यापक तस्वीर है, लेकिन अपने दूसरे पैरा में विशुद्ध रूप से की तलाश में, आप शुद्ध अभिव्यक्ति आधारित कोड लिख सकते हैं इसे बनाने, और उसके बाद खुला नहीं कर रहा हूँ अपने "प्रतिबिंब। प्रवेश" भाषा ऐड-इन का उपयोग करके परावर्तक में असेंबली। मेटा-मेटा ट्रिकरी का यह टुकड़ा आपको प्रतिबिंब दिखाएगा। अपने अभिव्यक्ति/लैम्ब्डा कोड को गतिशील रूप से उत्पन्न करने के लिए आवश्यक बयान सबमिट करें।

-Oisin
+0

मुझे लगता है कि मैं देख रहा हूं कि आप क्या प्राप्त कर रहे हैं लेकिन यदि आप मेरा संपादन देखते हैं: मुझे नहीं पता कि अभिव्यक्ति इनपुट के रनटाइम मूल्यांकन तक कैसा दिखाई देगी। – dkackman

3

मुझे नहीं लगता कि यह करने के लिए किसी भी तरह से बनाया जा सकता है है। सब के बाद, एक Expression मनमाने ढंग से रन समय मान है, जो एक विधानसभा में श्रृंखलाबद्ध नहीं किया जा सका कैप्चर कर सकते हैं।

यह तो आप इस के आसपास expr.Compile().Method.GetMethodBody().GetILAsByteArray() बुला आईएल बाइट है, जो तब एक विधानसभा है जिसे आप दर्ज करने के लिए लिख सकता है में एक MethodBuilder को पत्र लिखा जा सकता है के रूप में पाने के लिए मिल सकता है की तरह प्रतीत होता है। दुर्भाग्य से, यह काम नहीं करेगा - GetMethodBody() कॉल विफल रहता है क्योंकि प्रतिनिधि गतिशील है।

3

LambdaExpression एक CompileToMethod विधि है कि एक MethodBuilder को लक्षित करता है। इसका उपयोग और प्रतिबिंब। स्वीकार करें कि आपको कक्षा बनाने और इसे असेंबली में लिखने में सक्षम होना चाहिए।

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