2010-03-04 16 views
5

मेरे पास Expression<Func<T,DateTime>> है, मैं अभिव्यक्ति का डेटटाइम भाग लेना चाहता हूं और इसे बंद कर दूंगा। तो मैं इसे Expression<Func<T,int>> में बदल दूंगा, मुझे सच में यकीन नहीं है कि यह कैसे करें। मैंने ExpressionTree Visitor पर देखा लेकिन मुझे इसे काम करने की ज़रूरत नहीं है। यहाँ दिनांक समय अभिव्यक्तिमौजूदा अभिव्यक्ति से नया अभिव्यक्ति बनाएं

DateTimeExpression http://img442.imageshack.us/img442/6545/datetimeexpression.png

यहाँ का एक उदाहरण है कि मैं क्या MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

बनाने के लिए ऐसा लगता है कि मैं एक नया MemberExpression कि माह से बना है बनाने की जरूरत चाहते हैं का एक उदाहरण है डेटटाइम अभिव्यक्ति से संपत्ति लेकिन मुझे यकीन नहीं है।

+0

मैं अभिव्यक्ति वृक्ष व्यूअर कहां से उपयोग कर सकता हूं? क्या यह विजुअल स्टूडियो 2010 के लिए काम करता है? – MartinF

+0

यह लिंक नमूने के साथ आता है। इसका उपयोग करने का एक अच्छा उदाहरण यहां है http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx I haven स्टूडियो 2010 में इसकी कोशिश नहीं की लेकिन मुझे पता है कि यह 2008 में काम करता है। – Adam

उत्तर

8

हाँ, वह वास्तव में है कि तुम क्या चाहते हैं - और Expression.Property का उपयोग कर ऐसा करने के लिए सबसे आसान तरीका है:

Expression func = Expression.Property(existingFunc.Body, "Month"); 
Expression<Func<T, int>> lambda = 
    Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters); 

मुझे विश्वास है कि ठीक होना चाहिए। यह इस सरल परीक्षण में काम करता है:

using System; 
using System.Linq.Expressions; 

class Person 
{ 
    public DateTime Birthday { get; set; } 
} 

class Test 
{ 
    static void Main() 
    { 
     Person jon = new Person 
     { 
      Birthday = new DateTime(1976, 6, 19) 
     }; 

     Expression<Func<Person,DateTime>> dateTimeExtract = p => p.Birthday; 
     var monthExtract = ExtractMonth(dateTimeExtract); 
     var compiled = monthExtract.Compile(); 
     Console.WriteLine(compiled(jon)); 
    } 

    static Expression<Func<T,int>> ExtractMonth<T> 
     (Expression<Func<T,DateTime>> existingFunc) 
    { 
     Expression func = Expression.Property(existingFunc.Body, "Month"); 
     Expression<Func<T, int>> lambda = 
      Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters); 
     return lambda; 
    }           
} 
+0

पूरी तरह से काम किया। धन्यवाद जॉन – Adam

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