2011-01-18 6 views
6

निम्नलिखित अभिव्यक्ति पर विचार करें:"यह" के लिए ह्युरिस्टिक और बंद हो जाता है ठीक है? (अभिव्यक्ति पेड़)

class A { 
    int x; 
    public void Method(int y) { 
     Expression<Func<bool>> expr=() => x == y; 
     //... 

यहां, अभिव्यक्ति में y के लिए स्वचालित रूप से निर्मित बंद होना शामिल है, और this के A के संदर्भ (implicit) this.x के लिए संदर्भ शामिल है। अभिव्यक्ति वृक्ष में ConstantExpression पर दोनों को MemberExpression के रूप में दर्शाया जाएगा। इस संदर्भ और/या बंद होने के साथ expr या अधिक जटिल अभिव्यक्ति जैसे अभिव्यक्ति को देखते हुए, मैं यह जानना चाहता हूं कि एक विशेष ConstantExpression वास्तव में "यह" है या एक अंतर्निहित रूप से निर्मित बंद अभिव्यक्ति वृक्ष से C# को पुन: उत्पन्न करने में सक्षम है (ExpressionToCode)।

मैंने कुछ ह्युरिस्टिक्स का उपयोग करके "समाधान" बनाया है क्योंकि ऐसा कोई सही समाधान प्रतीत नहीं होता है।

  • लैम्ब्डा में क्लोजर और this हमेशा ConstantExpressions में होते हैं।
  • क्लोजर और this कभी null नहीं हैं।
  • दोनों वर्ग हैं, मूल्य प्रकार नहीं - आप एक संरचना से this के संदर्भ को कैप्चर नहीं कर सकते हैं। यह बहुत भाग्यशाली है, क्योंकि this.Method() से default(StructType).Method() को अन्यथा असंभव हो जाएगा जब भी this == default(StructType)
  • बिल्टिन प्रकार (स्ट्रिंग, एनम्स, दशमलव, टाइप, सभी प्राइमेटिव्स) वास्तव में वास्तविक स्थिरांक हैं, this नहीं या एक बंद
  • क्लोजर और बेनामी प्रकार < से शुरू होते हैं और CompilerGeneratedAttribute
    • के साथ एनोटेट किए जाते हैं क्लोजर नामों में शामिल होते हैं स्ट्रिंग DisplayClass, अज्ञात प्रकारों में AnonymousType
    • अज्ञात प्रकार सामान्य हैं, बंद नहीं हैं।
    • क्लोजर नेस्टेड कक्षाएं हैं, अनाम प्रकार नहीं हैं।
  • this एक सामान्य प्रकार होना चाहिए: CompilerGenerated नहीं और <

से शुरू नहीं होता है उपरोक्त हेरिस्टिक, वास्तविक स्थिरांक, this, बंद और अज्ञात प्रकारों के बीच अंतर करने के लिए पर्याप्त हैं? अर्थात। क्या ऐसे मामले हैं जहां ये हेरिस्टिक विफल हो जाते हैं, या क्या मुझे कोई याद आ रहा है? क्या भविष्य में .NET संस्करणों में तोड़ने की संभावना है?

संपादित करें: मैंने पहली बार इस प्रश्न को बिना किसी परिणाम के एक खुले अंत में फैशन में पूछा; मैं अब तक जो कुछ आया हूं उसे शामिल करने के लिए प्रश्न को फिर से लिखता हूं। किसी भी सुझाव की बहुत सराहना की - बक्षीस की कल समाप्त हो रही है, किसी भी विचार का स्वागत है ...

+0

क्या आप सुनिश्चित हैं कि आपकी धारणा सही है? मेरी राय में (मैं एक विशेषज्ञ नहीं हूं;)), एक्स अभिव्यक्ति में एक्स ए के किसी भी ज्ञान के बिना एक int के लिए 'संदर्भ' हो सकता है (और अभिव्यक्ति से ए के बारे में कोई रास्ता नहीं ढूंढने के लिए) – Guillaume86

+0

ठीक है मैं गलत हूं अभिव्यक्ति पेड़ों के साथ यह संभव है (और यह स्पष्ट है ^^) – Guillaume86

+0

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

उत्तर

2

ठीक है, मैं अभिव्यक्ति से के बारे में एक प्रकार खोजने के लिए प्रबंधन:

class Program 
{ 
    class A 
    { 
     int x; 
     public Expression<Func<bool>> Method(int y) 
     { 
      Expression<Func<bool>> expr =() => x == y; 
      return expr; 
     } 
    } 

    static void Main(string[] args) 
    { 
     var expr = new A().Method(10); 

     dynamic body = expr.Body; 

     A instance = body.Left.Expression.Value; 

     Console.Write(instance.ToString()); 

     Console.ReadKey(); 
    } 
} 

गतिशील बस जाने के लिए है तेजी से।

संपादित 2: इसे

+0

आप यहां क्या कर रहे हैं * यह सटीक उदाहरण * में काम करता है - लेकिन यह सामान्य रूप से काम नहीं करेगा। मैंने इस तथ्य से संबंधित प्रश्न के प्रासंगिक भाग को बोल्ड किया कि यह एक * मनमानी * अभिव्यक्ति है, और एक स्पष्टीकरण बिट जोड़ा गया है कि यह क्यों है और यह कैसे प्राप्त किया जा सकता है - देखने के लिए धन्यवाद! –

+0

मुझे डर है कि आप क्या करना चाहते हैं असंभव है, अभिव्यक्ति बिंदु से, 'अंतर्निहित' बंद करने और 'स्पष्ट' के बीच कोई अंतर नहीं है ... – Guillaume86

+0

आपका क्या मतलब है - स्पष्ट बंद? बंद हमेशा निहित होते हैं; और AFAIK वे नाम में 'DisplayClass' के साथ कक्षाएं उत्पन्न करते हैं - कम से कम वह उस ह्यूरिस्टिक का हिस्सा है जिसका मैं अब तक उपयोग कर रहा हूं। –

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