2011-03-16 6 views
6

यहाँ मैं करना चाहते हैं क्या है:क्या कोई सामान्य प्रकार की बाधा पर निर्दिष्ट कर सकता है जिसे इसे सामान्य प्रकार को लागू करना होगा?

public interface IRepository<TSet<TElement>> where TSet<TElement> : IEnumerable<TElement> 
{ 
    TSet<TEntity> GetSet<TEntity>(); 
} 

.NET में इस तरह के एक निर्माण संभव है?

संपादित करें: प्रश्न पर्याप्त स्पष्ट नहीं था। यहाँ मैं क्या करना चाहते है, का विस्तार:

public class DbRepository : IRepository<DbSet<TElement>> { 
    DbSet<TEntity> GetSet<TEntity>(); 
} 

public class ObjectRepository : IRepository<ObjectSet<TElement>> { 
    ObjectSet<TEntity> GetSet<TEntity>(); 
} 

अर्थ है, मैं करने के लिए विवश प्रकार हैं: - एक सामान्य पैरामीटर स्वीकार करते हैं - एक दिया एकल सामान्य पैरामीटर इंटरफ़ेस को लागू।

क्या यह संभव है? वास्तव में, मैं केवल पहली चीज़ से खुश रहूंगा।

public interface IRepository<TGeneric<TElement>> { 
    TGeneric<TArgument> GetThing<TArgument>(); 
} 
+1

यह संभव है लेकिन बिंदु क्या है? यदि 'TSet ' लागू करता है 'IENumerable ' आप 'IENumerable ' पर प्रतिबंध भी सेट कर सकते हैं। – Aliostad

+0

@Aliostad: संपादन देखें। मैं केवल "टेलीमेंट" सेट करना चाहता हूं जब फ़ंक्शन को कॉल किया जाता है, इंटरफ़ेस पर टाइप पैरामीटर के रूप में नहीं। –

+0

क्या 'तत्व' और 'इकाई की अलग-अलग चीजें हैं? – AakashM

उत्तर

5

आप इस लक्ष्य को हासिल करने के लिए दो सामान्य प्रकार का उपयोग करने की आवश्यकता होगी, जैसे:

public interface IRepository<TCollection, TItem> where TCollection : IEnumerable<TItem> 
{ 
    TCollection GetSet<TItem>(); 
} 

(मैं TEntity संभालने कर रहा हूँ मूल में TElement किया जाना चाहिए था ...)

ऐसा कहा जा रहा है, यह संभवतः कुछ लिखने के लिए बेहतर है:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetSet<T>(); 
} 

यह उपरोक्त को पूरा करने का एक और आम माध्यम होगा।

+0

संपादन देखें: मैं इंटरफ़ेस के समान समय के लिए पैरामीटर प्रकार सेट करना नहीं चाहता, लेकिन केवल तभी जब 'GetSet' विधि लागू की जाती है। –

+0

समीक्षा के बाद, यह वास्तव में सही उत्तर है। –

0

अंत में, यह संभव नहीं प्रतीत होता है।

मैं अंत में मेरे अपने इंटरफेस को परिभाषित करते हुए कहा कि चारों ओर काम किया:

सार्वजनिक इंटरफ़ेस IRepository { IMySet GetSet(); }

और मैंने इन इंटरफेस को लागू करने वाली वस्तुओं में DbSet और ObjectSet दोनों को लपेट लिया।