2008-09-17 12 views
6

एमवीसी स्टोरफ्रंट से प्रेरित नवीनतम परियोजना जो मैं काम कर रहा हूं, फ़िल्टर परिणामों के लिए IQueryable पर विस्तार विधियों का उपयोग कर रहा हूं।एक्सटेंशन विधियां इंटरफ़ेस

मेरे पास यह इंटरफ़ेस है;

IPrimaryKey 
{ 
    int ID { get; } 
} 

और मैं इस विस्तार विधि

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id) 
{ 
    return source(obj => obj.ID == id); 
} 

चलो कहते हैं कि मैं एक वर्ग है, SimpleObj जो IPrimaryKey लागू करता करते है। जब मेरे पास SimpleObj का IQueryable है GetByID विधि मौजूद नहीं है, जब तक कि मैं स्पष्ट रूप से IPrimaryKey के IQueryable के रूप में नहीं डाला जाता, जो आदर्श से कम है।

क्या मुझे यहां कुछ याद आ रही है?

उत्तर

13

यह काम करता है

यह संभव है, जब मैं ObjectDataSource के साथ काम करने के लिए एक कस्टम इकाई की रूपरेखा समाधान के लिए बनाया गया एक समान पैटर्न लागू करने के लिए मिला है , जब सही हो गया। cfeduke का समाधान काम करता है। हालांकि, अगर आप IPrimaryKey इंटरफ़ेस सामान्य बनाने के लिए की जरूरत नहीं है, वास्तव में, यदि आपको अपना मूल परिभाषा को बदलने के लिए नहीं है:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey 
{ 
    return source(obj => obj.ID == id); 
} 
+0

बहुत बढ़िया - मैं अस्वीकृत कर दिया मूल जवाब। मैं कल यह कोशिश करूँगा। आप दोनों को शुक्रिया। – Kirschstein

+1

मैं बस इतना कहना चाहूंगा कि मेरा जवाब गलत नहीं था, यही कारण था कि उसका कोड काम नहीं कर रहा था, मैंने अभी समाधान करने के लिए समय नहीं लिया। ऊपर आपके बेहतर जवाब मतदान किया। –

+0

बस एक बहुत मामूली बिंदु: IPrimaryKey // बेहतर एकीकरण: यह (इस IQueryable स्रोत ... – Kirschstein

2

यह इस तथ्य के कारण काम नहीं कर सकता कि जेनेरिकों में विरासत पैटर्न का पालन करने की क्षमता नहीं है। अर्थात। IQueryable <SimpleObj> IQueryable <IPrimaryKey>

4

संपादित की विरासत पेड़ में नहीं है: Konrad के समाधान क्योंकि इसके बहुत आसान बेहतर है। नीचे दिया गया समाधान काम करता है लेकिन केवल ऑब्जेक्टडाटासोर्स जैसी स्थितियों में आवश्यक है जहां विरासत पदानुक्रम को चलाने के बिना प्रतिबिंब के माध्यम से कक्षा की विधि पुनर्प्राप्त की जाती है। जाहिर है कि यह यहाँ नहीं हो रहा है।

उपयोग की
public interface IPrimaryKey<T> where T : IPrimaryKey<T> 
{ 
    int Id { get; } 
} 

public static class IPrimaryKeyTExtension 
{ 
    public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T> 
    { 
     return source.Where(pk => pk.Id == id).SingleOrDefault(); 
    } 
} 

public class Person : IPrimaryKey<Person> 
{ 
    public int Id { get; set; } 
} 

स्निपेट::

var people = new List<Person> 
{ 
    new Person { Id = 1 }, 
    new Person { Id = 2 }, 
    new Person { Id = 3 } 
}; 

var personOne = people.AsQueryable().GetById(1); 
संबंधित मुद्दे