मेरे पास ऐसी स्थिति है जहां मुझे वस्तुओं की सूची पर लागू करने के लिए गतिशील रूप से फ़िल्टर की एक सूची बनाने की आवश्यकता है। वे वस्तुएं ऐसी कुछ भी हो सकती हैं जो एक इंटरफ़ेस लागू करती है जिसमें सभी गुणों को फ़िल्टर करने की आवश्यकता होती है।सी # जेनेरिक बाधा अपेक्षित काम नहीं कर रही है
public interface IStuff
{
bool SuitableForSomething { get; set; }
bool SuitableForSomethingElse { get; set; }
}
public class SomeStuff : IStuff
{
...
}
public class SomeOtherStuff : IStuff
{
...
}
मैं बहुत तरह परिभाषित मापदंड की एक सूची है ...
public List<Expression<Func<IStuff, bool>>> Criteria { get; private set; }
और इतने की तरह मानदंड जोड़ने ...
Criteria.Add(x => x.SuitableForSomething);
Criteria.Add(x => x.SuitableForSomethingElse);
मैं तो यह नियम लागू मेरी क्वेरी के लिए ...
var stuff= _stuffCache
.GetAll()
.AsQueryable()
.ApplyCriteria(Criteria);
जो निम्नलिखित विस्तार विधि का उपयोग करता ...
public static IQueryable<T> ApplyCriteria<T>(this IQueryable<T> stuff, List<Expression<Func<IStuff, bool>>> criteria)
where T : IStuff
{
foreach (var expression in criteria)
{
stuff = Queryable.Where(stuff, expression);
}
return stuff;
}
संकलक मुझे बता रहा है ...
cannot convert from
'System.Linq.Expressions.Expression<System.Func<IStuff,bool>>'
to
'System.Linq.Expressions.Expression<System.Func<T,int,bool>>'
जब मैं में त्रुटि के तहत लाल रेखा पर ले जाएं, आईडीई यह कह रहा है कि यह
IQueryable<IStuff> Where<IStuff>(this IQueryable<IStuff>, Expression<Func<IStuff, bool>>) in class Queryable
and
IQueryable<T> Where<T>(this IQueryable<T>, Expression<Func<T,int,bool>>) in class Queryable
के बीच विधि को हल नहीं कर सकता है
यदि मैं अभिव्यक्ति को Expression<Func<T, bool>>
पर कास्ट करने का प्रयास करता हूं, तो टी को काम करना चाहिए क्योंकि टी को आईएसटीफ इंटरफ़ेस को लागू करने के लिए बाध्य किया गया है। मैं Raphaël के जवाब मैं विस्तार विधि तय की और अंत में वास्तविक समस्या मैं था, जब मैं कोड बुला रहा था जो एक कास्टिंग समस्या थी पाया करने के लिए
Cannot cast expression of type 'Expression<Func<IStuff, bool>>' to type 'Expression<Func<T, bool>>'
संपादित धन्यवाद मिलता है। ApplyCriteria
कॉल के बाद .Cast<SomeStuff>()
जोड़कर आसानी से तय किया गया।
पहले
var stuff= _stuffCache
.GetAll()
.AsQueryable()
.ApplyCriteria(Criteria);
बाद
var stuff= _stuffCache
.GetAll()
.AsQueryable()
.ApplyCriteria(Criteria)
.Cast<SomeStuff>();
सुधार के लिए सही उत्तर और काल्पनिक +1 के लिए +1 लिखा गया। – SimpleVar
धन्यवाद। मैंने पहले से ही कोशिश की थी और अन्य त्रुटियां मिलीं, जिन्हें अब मुझे समाधान मिला है। मैं विवरण के साथ प्रश्न अद्यतन कर दूंगा। –