2009-08-28 22 views
6

सी #, .NET 3.5सी # सार जेनेरिक विधि

मैं एक बेस क्लास बनाने की कोशिश कर रहा हूं जिसमें एक सामान्य विधि है। जिन वर्गों से प्राप्त होता है उन्हें विधि के प्रकार निर्दिष्ट करना चाहिए।

इसके लिए आधार फ़िल्टरिंग प्रबंधित करने वाले वर्ग बनाने के लिए है।

तो मेरे पास है:

public abstract class FilterBase { 
    //NEED Help Declaring the Generic method for GetFilter 
    //public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

public class ProjectFilter:FilterBase { 
    public IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) { 
    //do stuff with query 
    return query; 
    } 
} 

public class ProjectList { 
    public static ProjectList GetList(ProjectFilter filter) { 
    var query = //....Linq code... 

    query = filterCriteria.GetFilter(query); 

    } 

} 

सोचो यह कुछ आसान है, लेकिन मैं GetFilter सार विधि के लिए FilterBase में सही वाक्य रचना नहीं कर सकते।

संपादित

आदर्श रूप में, केवल विधि सामान्य रूप में है और वर्ग रखना चाहते हैं। यदि संभव नहीं है, तो कृपया मुझे बताएं ..

उत्तर

15

फ़िल्टरबेस क्लास को सामान्य बनाएं।

public abstract class FilterBase<T> 
{ 
    public abstract IQueryable<T> GetFilter(IQueryable<T> query); 
} 

यह इस तरह से अपनी ProjectFilter वर्ग बनाने के लिए सक्षम होगा:

public class ProjectFilter : FilterBase<Linq.Project> 
{ 
    public override IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) 
    { 
     //do stuff with query 
     return query; 
    } 
} 
+0

जो काम करता है, क्या मुझे क्लास जेनेरिक बनाना है? क्या मैं सिर्फ विधि सामान्य नहीं रख सकता? कारण मैं पूछता हूं कि एक ही कक्षा के लिए कई गेटफिल्टर हो सकते हैं जो 'LINQ.Project' –

+1

@B Z से भिन्न IQueryable लेते हैं: आप केवल सामान्य विधि बना सकते हैं, लेकिन फिर इसे लागू होने तक सामान्य रहना होगा। आप गैर-जेनेरिक वर्ग से प्राप्त नहीं कर सकते हैं और जब आप अपने प्रश्न में प्रयास करते हैं तो सामान्य प्रकार को विधि पर असाइन करें। कॉलर को उस मामले में विधि को प्रकार की आपूर्ति करनी होगी। –

+0

@ मार्क - thx। मुझे एक सीमा की तरह लगता है? क्या आपको पता है कि वहां और स्पष्टीकरण है? हो सकता है कि जॉन स्कीट की सी # गहराई में? –

4
public abstract class FilterBase<T> { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 
2
बेशक

, आप एक सार सामान्य विधि हो सकता है:

public abstract class FilterBase { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

समस्या है इसका मतलब यह नहीं है कि आप क्या चाहते हैं। इसे किसी भी T के लिए बुलाया जा सकता है। विशेष रूप से, निम्नलिखित काम करना चाहिए, के बाद से ProjectFilterFilterBase से निकला है:

FilterBase fb = new ProjectFilter(...); 
IQueryable<string> query = ...; 
IQueryable<string> filter = fb.GetFilter<string>(query); 

तो FilterBase सिर्फ GetFilter<Linq.Project> लागू नहीं कर सकते। इसे GetFilter<string>, GetFilter<int>, आदि लागू करने की आवश्यकता है; संक्षेप में, GetFilter<T>। तो आप देख सकते हैं कि यह एक सीमा नहीं है।

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