2011-11-07 9 views
6

क्या Expression<Func<T>,bool> से गुण, ऑपरेटर और मिलान मान को निकालने का कोई तरीका है? निम्न उदाहरण को देखते हुए:अभिव्यक्ति <Func <T, bool>> अनुमान से गुण, ऑपरेटर और मूल्य कैसे प्राप्त करते हैं?

var customers = GetCustomers(); 
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only 

मैं की तरह कुछ बाहर निकलने के लिए सक्षम होना चाहिए निम्नलिखित:

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

मैं पहले से ही कुछ ऐसा है जो एक अभिव्यक्ति की संपत्ति नाम बाहर खींच सकते हैं लिखा है, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि मूल्य और ऑपरेटर कहां आयोजित किए जाते हैं, हालांकि यह अभिव्यक्ति की डीबग व्यू संपत्ति में स्पष्ट रूप से दिखाई देता है।

उत्तर

8

ऑपरेटर BinaryExpression के Method पर होगा जो Equals नोड है। आपको .NodeType अभिव्यक्तियों को भी देखना चाहिए, जो बहुत अधिक बताता है (यह Equal होना चाहिए)।

मूल्यों विशिष्ट रूप से उस BinaryExpression की .Right में एक ConstantExpression में हो जाएगा, या एक पर कब्जा कर लिया चर के मामले में: कब्जा संदर्भConstantExpression होंगे, इसलिए मूल्य एक MemberExpression हो जाएगा ConstantExpression पर (आपको जांच करनी होगी कि सदस्य FieldInfo बनाम PropertyInfo है, और उस पर .GetValue(...) के माध्यम से मान लाएं)।

+0

उत्कृष्ट, धन्यवाद। बस '(बाइनरीएक्सप्रेस) का उपयोग करके' predicate' डालना पड़ा था। बॉडी 'और अब सबकुछ स्पष्ट है। चीयर्स मार्क। – GenericTypeTea

3

मार्क ग्रेवल्स के जवाब के अलावा (+1 वहां) मैं सिर्फ यह जोड़ूंगा कि ExpressionVisitor कक्षा (नेट 4 में बॉक्स के बाहर; एमएसडीएन का एक उदाहरण है कि आप कॉपी/पेस्ट कर सकते हैं 3.5 के लिए)। यह कुछ प्रकार की अभिव्यक्ति को निकालने के लिए लेखन कोड बहुत आसान बनाता है।

आपके मामले में आप इसे VisitBinary विधि है ओवरराइड करने के लिए देख रहा होगा।

मैं आम तौर पर अभिव्यक्ति (रों) मैं केवल पढ़ने के लिए सूची में में दिलचस्पी रखता हूँ, उदाहरण के लिए, जो मैं तो वर्ग की मेरी कार्यान्वयन पर सार्वजनिक रूप से उपलब्ध कराने के पुश करने के लिए वर्ग का उपयोग करें। आप अभिव्यक्ति को फिर से लिखने के लिए इसका उपयोग नहीं कर रहे हैं।

+0

+1, धन्यवाद। यह निश्चित रूप से यह आसान बाइनरी भाव को खोजने के लिए बनाता है, लेकिन उसे स्वीकार के रूप में के रूप में यह कहते हैं कि कैसे बाहर जानकारी मैं की आवश्यकता होती है खींचने के लिए मैं मार्क के जवाब छोड़ देंगे। – GenericTypeTea

+0

हाँ मैं सहमत हूँ - मार्क का जवाब आप नट और इस प्रश्न के लिए बोल्ट देता है और टिक हकदार; मेरा केवल प्राप्त करने के लिए वह क्या सुझाव दिया है एक आसान तरीका पेशकश कर रहा है :) –

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