मैंने एक फ़िल्टर करने योग्य बाइंडिंगलिस्ट from this source बनाया। यह बहुत अच्छा काम करता है:कैसे एक सिस्टम बनाने के लिए। Linq.Expressions.Expression पसंद के लिए?
list.Filter("Customer == 'Name'");
यह क्या करना चाहिए। आंतरिक एक पार्सर की तरह काम करते हैं, जो ==
या !=
अभिव्यक्ति को System.Linq.Expressions.Expression
में परिवर्तित करता है। इस मामले में, ==
System.Linq.Expressions.Expression.Equal
बन जाता है।
दुर्भाग्य से System.Linq.Expressions.Expression
में एक समान ऑपरेटर नहीं है और मुझे नहीं पता कि इसे कैसे हल किया जाए।
प्रारंभिक कोड इस तरह दिखता है:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
उदहारण के लिए:
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
तो मैं एक अभिव्यक्ति है कि मैं क्या चाहते हो जाएगा बनाया
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
लेकिन binaryOpFactory
इस की आवश्यकता है:
Func<Expression, Expression, Expression>
पूर्वनिर्धारित भाव ठीक होने लगते हैं:
System.Linq.Expressions.Expression.Or;
किसी को मुझे बताओ कि मेरी अभिव्यक्ति कन्वर्ट करने के लिए कर सकते हैं?
और कैसे अपने तरह काम करता है? मैं आपको अभिव्यक्ति बनाने में मदद कर सकता हूं, लेकिन मुझे यह समझने की ज़रूरत है कि आप इसे पहले कैसे काम करना चाहते हैं ... regex? शामिल? आदि? –
इससे कोई फर्क नहीं पड़ता। अंतिम कार्यान्वयन संभवतः regexp के साथ होगा। असल में मेरे पास एक Func <स्ट्रिंग, स्ट्रिंग, बूल> है कि मैं 2 स्ट्रिंग्स पास करता हूं और वापसी के रूप में सत्य या गलत हो जाता हूं। मेरी समस्या यह है कि मैं System.Linq.Expressions.Expression नेमस्पेस में ऑब्जेक्ट्स के कार्यान्वयन को समझ नहीं पा रहा हूं, जो फंक <अभिव्यक्ति, अभिव्यक्ति, अभिव्यक्ति> (बाइनरीऑप फैक्ट्री के जेनेरिक प्रकार के तर्कों को देखें) जैसा कि मैं नहीं बना सकता मेरी अपनी तुलना –
पुन: टिप्पणी करें: अभिव्यक्ति API को समझना कुछ कर सकता है ... मैं अपने ब्लॉग पर कुछ मूलभूत बातें शामिल करने का प्रयास करता हूं; जॉन की पुस्तक (गहराई में सी #) भी एक उच्च स्तरीय अवलोकन प्रदान करता है। –