2010-06-13 14 views
5

मैं जानना चाहूंगा कि (और यदि ऐसा है तो) एक सामान्य वर्ग घोषणा में एक बाधा पैरामीटर के रूप में नामस्थान को परिभाषित करना संभव है।जेनेरिक क्लास घोषणा के साथ नेमस्पेस बाधा

यह क्या मेरे पास है:

namespace MyProject.Models.Entities < - स्पष्ट मुझे लगता है कि

-

namespace MyProject.Tests.BaseTest < DB में कायम किए जाने की मेरी कक्षाएं शामिल

अब मेरी 'बेसटेस्ट' कक्षा की घोषणा इस तरह दिखती है;

public class BaseTest<T> 

यह BaseTest करता है छोटे से अधिक सभी संस्थाओं है कि परीक्षण के दौरान डेटाबेस में जोड़ा गया था हटाने से (लेखन के समय)। तो आम तौर पर मैं एक परीक्षण वर्ग घोषित जाता है कि उसे:

public class MyEntityRepositoryTest : BaseTest<MyEntity> 

मैं करना चाहते हैं क्या निम्न जैसा कुछ है:

public class BaseTest<T> where T : <is of the MyProject.Models.Entities namespace> 

अब मुझे पता है कि यह पूरी तरह से संभव हो जाएगा हूँ बस एक 'बेसएन्टीटी' कक्षा घोषित करें जिसमें से MyProject.Models.Entities नामस्थान के भीतर बनाई गई सभी संस्थाएं उत्तराधिकारी होंगी;

public class BaseTest<T> where T : MyBaseEntity 

लेकिन ... मुझे वास्तव में आवश्यकता नहीं है, या मैं चाहता हूं। इसके अलावा मैं विरासत के साथ एक ओआरएम और मैपिंग इकाइयों का उपयोग कर रहा हूं, हालांकि संभव है, जटिलता की एक परत जोड़ती है जो आवश्यक नहीं है।

तो, क्या नामस्थान में एक सामान्य वर्ग पैरामीटर को बाधित करना संभव है और एक विशिष्ट प्रकार नहीं है?

उत्तर

10

नामस्थानों में ऐसी कोई बाधा उत्पन्न करना संभव नहीं है।

public की बजाय अपनी जेनेरिक कक्षा internal बनाने के लिए एक और बेहतर कामकाज होगा। इसका मतलब यह है कि कक्षा केवल सीधे हो सकती है जो उसी असेंबली में कक्षाओं द्वारा तत्काल और एक्सेस की जाती है (जब तक आप InternalsVisibleTo विशेषता का उपयोग नहीं करते)। हालांकि, यह अभी भी अप्रत्यक्ष रूप से तत्काल (यानी सार्वजनिक कक्षा के संरक्षित/निजी सदस्य के रूप में) हो सकता है।

+0

सहमत हुए। और, यदि आप जिस प्रकार को अनुमति देना चाहते हैं वह एक अलग असेंबली में है तो 'InternalsVisibleToAttribute' में देखें। मैं नियमित रूप से विभिन्न असेंबली में यूनिट परीक्षणों के साथ इसका उपयोग करता हूं। –

+0

यह एक शर्म की बात है, मुझे आश्चर्य है कि आप लैम्ब्डा अभिव्यक्तियों या कुछ के साथ कुछ नहीं कर सकते हैं। चिंता न करें, कि 'आंतरिक' समाधान मेरी आवश्यकताओं को आधे रास्ते से पूरा करता है। मार्गदर्शन के लिए धन्यवाद। – SomeGuy

+0

@ सोमगुई, जहां तक ​​मुझे पता है, लैम्ब्डा अभी भी केवल एक रनटाइम चीज है (अभिव्यक्तियों के साथ उपयोग किए जाने के अलावा, लेकिन फिर भी वे संकलन समय पर निष्पादन योग्य नहीं हैं)। इस बारे में कुछ चर्चा हुई है कि क्या संभावित सी # 5.0 कंपाइलर-ए-ए-सर्विस सुविधा संकलक के कुछ अनुकूलन की अनुमति दे सकती है, हालांकि मुझे यह संदेह है कि अगर हम इसे कभी देखेंगे। –

2

कंपाइलर आपके लिए यह जांच नहीं करेगा। हालांकि आप अपने बाधा के लिए एक स्थिर निर्माता में शायद रनटाइम पर इस बाधा को सत्यापित कर सकते हैं।

3

एक नामस्थान बाधा कोई मूल्य नहीं होगी। कोई भी तीसरी पार्टी कक्षा बना सकती है और उस वर्ग को उसी नामस्थान में रख सकती है।

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