2010-07-05 13 views
6

किसी को उत्तर देने से पहले, कृपया प्रश्न पढ़ें।ExpressionVisitor क्या करता है। <T> क्या करें?

.NET 4.0 के ExpressionVisitor में विधि का उद्देश्य क्या है:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor) 

इस विधि का उद्देश्य के रूप में मेरा पहला अनुमान था कि यह हर एक पेड़ nodes द्वारा निर्दिष्ट में प्रत्येक नोड का दौरा करेंगे पैरामीटर और elementVisitor फ़ंक्शन के परिणाम का उपयोग करके पेड़ को फिर से लिखें।

यह मामला प्रतीत नहीं होता है। असल में यह विधि कुछ भी नहीं करने के लिए प्रतीत होती है, जब तक कि मुझे यहां कुछ याद नहीं आ रहा है, जो मुझे दृढ़ता से संदेह है कि मैं ...

मैंने इस विधि का उपयोग अपने कोड में करने की कोशिश की और जब चीजें काम नहीं करतीं जैसा कि अपेक्षित था, मैंने विधि को प्रतिबिंबित किया और पाया:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor) 
{ 
    T[] list = null; 
    int index = 0; 
    int count = nodes.Count; 
    while (index < count) 
    { 
     T objA = elementVisitor(nodes[index]); 
     if (list != null) 
     { 
      list[index] = objA; 
     } 
     else if (!object.ReferenceEquals(objA, nodes[index])) 
     { 
      list = new T[count]; 
      for (int i = 0; i < index; i++) 
      { 
       list[i] = nodes[i]; 
      } 
      list[index] = objA; 
     } 
     index++; 
    } 
    if (list == null) 
    { 
     return nodes; 
    } 
    return new TrueReadOnlyCollection<T>(list); 
} 

तो कोई वास्तव में इस विधि का उपयोग करने के बारे में कहां जाएगा? मुझे यहां क्या समझ नहीं आ रहा है?

धन्यवाद।

उत्तर

3

यह मुझे एक अभिव्यक्ति वृक्ष में एक क्रियात्मक परिवर्तन फ़ंक्शन को लागू करने के लिए एक सुविधाजनक तरीका की तरह दिखता है, और परिणामस्वरूप परिवर्तित पेड़, या मूल पेड़ को कोई परिवर्तन नहीं होने पर वापस लौटाता है।

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

उपयोग के लिए के रूप में:

Expression<Func<int, int, int>> addLambdaExpression= (a, b) => a + b; 

// Change add to subtract 
Func<Expression, Expression> changeToSubtract = e => 
{ 
    if (e is BinaryExpression) 
    { 
     return Expression.Subtract((e as BinaryExpression).Left, 
            (e as BinaryExpression).Right); 
    } 
    else 
    { 
     return e; 
    } 
}; 

var nodes = new Expression[] { addLambdaExpression.Body }.ToList().AsReadOnly(); 
var subtractExpression = ExpressionVisitor.Visit(nodes, changeToSubtract); 

आप की व्याख्या नहीं करते आप कैसे यह व्यवहार करने की उम्मीद है और क्यों इसलिए आप कुछ नहीं से छोटे से अधिक करता है लगता है।

+1

मैं उम्मीद करता हूं कि यह addlambdaExpression में पूरे पेड़ पर जायेगा, न केवल addLambdaExpression। – Jeff

+0

उस स्थिति में आप ExpressionVisitor से एक कस्टम प्रकार का उत्तराधिकारी प्राप्त करना चाहते हैं और विज़िट() विधि में NodeType.Lambda को संभालेंगे। – codekaizen

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