मैं संलग्न करने के लिए जहां विधेय और मेरा लक्ष्य के रूप में ही अभिव्यक्ति बनाने के लिए है की कोशिश कर रहा:मैं गतिशील रूप से अभिव्यक्ति कैसे बना सकता हूं <Func <MyClass, bool >> अभिव्यक्ति से भविष्यवाणी <Func <MyClass, string >>?
Services.Where(s => s.Name == "Modules" && s.Namespace == "Namespace");
मैं निम्नलिखित कोड है:
s => ((s.Name == "Modules") AndAlso (s.Namespace == "Namespace"))
:
Expression<Func<Service,string>> sel1 = s => s.Name;
Expression<Func<Service,string>> sel2 = s => s.Namespace;
var val1 = Expression.Constant("Modules");
var val2 = Expression.Constant("Namespace");
Expression e1 = Expression.Equal(sel1.Body, val1);
Expression e2 = Expression.Equal(sel2.Body, val2);
var andExp = Expression.AndAlso(e1, e2);
ParameterExpression argParam = Expression.Parameter(typeof(string), "s");
var lambda = Expression.Lambda<Func<string, bool>>(andExp, argParam);
यह निम्न उत्पादन बनाने
हालांकि, यह के पैरामीटर के बाद से दोषपूर्ण है क्योंकि नाम और नेमस्पेस समान नहीं है। अगर मैं करने के लिए अभिव्यक्ति चयनकर्ता में से एक बदलने के लिए:
Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
उत्पादन होगा:
s => ((s.Name == "Modules") AndAlso (srv.Namespace == "Namespace"))
मैं sel1 और sel2 के उपयोग के साथ एक वैध अभिव्यक्ति कैसे बना सकते हैं?
अद्यतन (28 फ़र, 2011)
मैं भाव आह्वान बनाने के द्वारा इसे हल:
Expression<Func<Service,string>> sel1 = s => s.Name;
Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
var val1 = Expression.Constant("Modules");
var val2 = Expression.Constant("Namespace");
Expression<Func<Service, bool>> lambda = m => true;
var modelParameter = lambda.Parameters.First();
// sel1 predicate
{
var invokedExpr = Expression.Invoke(sel1, modelParameter);
var binaryExpression = Expression.Equal(invokedExpr, val1);
lambda = Expression.Lambda<Func<Service, bool>>(Expression.AndAlso(binaryExpression, lambda.Body), lambda.Parameters);
}
// sel2 predicate
{
var invokedExpr = Expression.Invoke(sel2, modelParameter);
var binaryExpression = Expression.Equal(invokedExpr, val2);
lambda = Expression.Lambda<Func<Service, bool>>(Expression.AndAlso(binaryExpression, lambda.Body), lambda.Parameters);
}
आप PredicateBuilder माना जाता है? यह विशेष रूप से "अनुमान लगाने की कोशिश कर रहा है" को हल करने के लिए डिज़ाइन किया गया है। http://www.albahari.com/nutshell/predicatebuilder.aspx –
बहुत रोचक लगता है, मैं इसे देख लूंगा। धन्यवाद किर्क! –