2012-10-05 16 views
7

है, क्या यह पता लगाने का एक आसान तरीका है कि क्या अभिव्यक्ति में पैरामीटर एक्स्प्रेशन है जो उदाहरण के लिए एक सदस्य एक्स्प्रेशन नहीं है।यह पता लगाना कि क्या अभिव्यक्ति में "अकेला" पैरामीटर एक्स्प्रेशन

उदाहरण:

x => x.Method() ? x : null < = 1 किसी भी आगे के मूल्यांकन के बिना एक्स की घटना किसी भी आगे के मूल्यांकन के बिना एक्स के

x => x.Method() ? x.Property : null < = 0 आवृत्तियां

आप अपने प्रयोग के मामले डाल मुझे पता है कि है विधि (कोई पैराम) और संपत्ति मूल्य और यह पता लगाना चाहते हैं कि यह "ऑब्जेक्ट" स्टोर से बिना किसी अभिव्यक्ति का मूल्यांकन करने के लिए पर्याप्त है या नहीं।

संपादित करें: मेरा उदाहरण शायद सरलीकृत हो सकता है। ऐसे कई अभिव्यक्ति प्रकार हैं जिन्हें संभालने की आवश्यकता है (उदाहरण के लिए UnaryExpression)।

, एक अभिव्यक्ति दी है कि अगर मैं सब विधि वापसी मूल्यों और की संपत्ति मूल्यों पता:

x => ((Cast) x).Property < = 0 किसी भी आगे के मूल्यांकन के

मैं निम्नलिखित प्रश्न का उत्तर की तलाश में हूँ बिना एक्स के आवृत्तियां इनपुट पैरामीटर लेकिन पैरामीटर मान स्वयं नहीं, क्या मैं अभिव्यक्ति का मूल्यांकन कर सकता हूं?

+0

नेट किस संस्करण का उपयोग कर रहे हैं? –

+0

यह .NET 3.5 है (लेकिन मेरे पास एक .NET 4 संस्करण भी है जहां मैं इसका उपयोग कर सकता हूं) – lindstromhenrik

उत्तर

1

यदि आप .NET 4 या बाद में हैं, तो आप इसके लिए ExpressionVisitor का उपयोग कर सकते हैं।

मैं काफी यकीन है कि आप "अकेला पैरामीटर" कैसे परिभाषित नहीं कर रहा हूँ, लेकिन अगर आप प्रत्यक्ष विधि कॉल बाहर करना चाहते हैं, सदस्य एक्सेस करता है और इंडेक्सर मानकों पर पहुंचता है, तो आप कुछ इस तरह (untested) का उपयोग कर सकते हैं:

इस तरह यह प्रयोग करें:

new MyExpressionVisitor().GetNumLonelyParameterExpressions(myExpression.Body) 

public class MyExpressionVisitor : ExpressionVisitor 
{ 
    private int numLonelyParameterExpressions; 

    public int GetNumLonelyParameterExpressions(Expression expression) 
    { 
     numLonelyParameterExpressions = 0; 
     Visit(expression); 
     return numLonelyParameterExpressions; 
    } 

    protected override Expression VisitParameter(ParameterExpression node) 
    { 
     // Every time we encounter a lonely parameter, increment. 
     numLonelyParameterExpressions++; 
     return base.VisitParameter(node); 
    } 

    protected override Expression VisitMethodCall(MethodCallExpression node) 
    { 
     // Don't visit parameters that have methods called on them. 
     var expr = (node.Object is ParameterExpression) 
      ? Expression.Default(node.Object.Type) 
      : node.Object; 

     // We need to make sure the arguments are visited though. 
     return base.VisitMethodCall(node.Update(expr, node.Arguments)); 
    } 


    protected override Expression VisitMember(MemberExpression node) 
    { 
      // Don't visit parameters with member accesses on them. 
      if (node.Expression is ParameterExpression) 
       return Expression.Default(node.Type); 

      return base.VisitMember(node); 
    } 

    protected override Expression VisitIndex(IndexExpression node) 
    { 
     // Same idea here. 
     var expr = (node.Object is ParameterExpression) 
      ? Expression.Default(node.Object.Type) 
      : node.Object; 

     return base.VisitIndex(node.Update(expr, node.Arguments)); 
    } 
} 
+0

यह मेरा वर्तमान दृष्टिकोण है (मेरे पास 3.5 के लिए मेरा स्वयं का अभिव्यक्ति विजिटर है)। हालांकि वहां अधिक अभिव्यक्तियां हैं जिन्हें गिना जाना चाहिए और मुझे डर है कि मुझे कुछ याद आ रहा है। एक उदाहरण के लिए UnaryExpression है: x => ((कास्ट) एक्स)। प्रजनन। – lindstromhenrik

+0

@ लिंडस्ट्रोमेरिक: मुझे लगता है कि आपको 'अकेला' वास्तव में अच्छी तरह से परिभाषित करना होगा जैसे कि आप इसे शामिल करते हैं, यह बहुत अस्पष्ट है। – Ani

+0

मैंने एक बेहतर व्याख्या देने की कोशिश की है लेकिन मुझे अभी भी सच में यकीन नहीं है कि समस्या को क्या कॉल करना है ;-) – lindstromhenrik

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