2012-06-14 21 views
6

मेरे पास ऐसी स्थिति है जहां मुझे वस्तुओं की सूची पर लागू करने के लिए गतिशील रूप से फ़िल्टर की एक सूची बनाने की आवश्यकता है। वे वस्तुएं ऐसी कुछ भी हो सकती हैं जो एक इंटरफ़ेस लागू करती है जिसमें सभी गुणों को फ़िल्टर करने की आवश्यकता होती है।सी # जेनेरिक बाधा अपेक्षित काम नहीं कर रही है

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>(); 

उत्तर

7

परिवर्तन दूसरा पैरामीटर प्रकार के List<Expression<Func<T,bool>>> (बजाय IStuff की टी)

public static IQueryable<T> ApplyCriteria<T>(this IQueryable<T> stuff, List<Expression<Func<T, bool>>> criteria) 
    where T : IStuff 
{ 
    foreach (var expression in criteria) 
    { 
     stuff = Queryable.Where(stuff, expression); 
     //or stuff = stuff.Where(expression), as Where is an Extension method; 
    } 
    return stuff; 
} 

और अपने तरीका हो सकता है (THX reshar प्रति),

public static IQueryable<T> ApplyCriteria<T>(this IQueryable<T> stuff, List<Expression<Func<T, bool>>> criteria) 
      where T : IStuff 
     { 
      return criteria.Aggregate(stuff, (current, expression) => current.Where(expression)); 
     } 
+0

सुधार के लिए सही उत्तर और काल्पनिक +1 के लिए +1 लिखा गया। – SimpleVar

+0

धन्यवाद। मैंने पहले से ही कोशिश की थी और अन्य त्रुटियां मिलीं, जिन्हें अब मुझे समाधान मिला है। मैं विवरण के साथ प्रश्न अद्यतन कर दूंगा। –

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