2010-07-29 9 views
15

में पैरामीटर टाइप करें क्या सामान्य प्रकार के रचनाकारों के साथ कक्षाओं की आवश्यकता के लिए new() कन्स्ट्रक्टर बाधा का उपयोग करने वाला जेनेरिक विधि बनाने का कोई तरीका है?सी # सामान्य तरीकों, नए() कन्स्ट्रक्टर बाधा

उदाहरण के लिए:

मैं निम्नलिखित कोड है:

public T MyGenericMethod<T>(MyClass c) where T : class 
{ 
    if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) 
    { 
     throw new ArgumentException("Invalid class supplied"); 
    } 
    // ... 
} 

क्या यह संभव है इस के बजाय की तरह कुछ है करने के लिए?

public T MyGenericMethod<T>(MyClass c) where T : new(MyClass) 
{ 
    // ... 
} 

संपादित करें: है a suggestion इस बारे में। कृपया वोट दें ताकि हम इस सुविधा को सी # में प्राप्त कर सकें!

+1

मैं थोड़ा उलझन में हूं। वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं। क्या निर्माता MyClass का पैरामीटर लेगा, या आप टी को MyClass सीमित कर रहे हैं? –

उत्तर

28

वास्तव में नहीं; सी # केवल नो-Args कन्स्ट्रक्टर बाधाओं का समर्थन करता है। जब बुला तो

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) { 
    // ... 
    T newTObj = ctor(c); 
    // ... 
} 

:

MyClass c = new MyClass(); 
MyGenericMethod<OtherClass>(c, co => new OtherClass(co)); 
4

नहीं। दुर्भाग्य से, सामान्य कमी केवल आप शामिल करने की अनुमति

वैकल्पिक हल मैं सामान्य आर्ग निर्माताओं के लिए उपयोग करने के एक प्रतिनिधि के रूप कंस्ट्रक्टर निर्दिष्ट करने के लिए है :

where T : new() 

जो निर्दिष्ट करता है कि एक डिफ़ॉल्ट, पैरामीटर रहित कॉन है structor। एक निर्माता के साथ एक प्रकार को बाधित करने का कोई तरीका नहीं है जो एक विशिष्ट पैरामीटर प्रकार स्वीकार करता है।

विवरण के लिए, Constraints on Type Parameters देखें।

+0

हाँ, मैंने उस लेख को पढ़ा, लेकिन यह नई() बाधा के बारे में बहुत विशिष्ट नहीं था। वैसे भी, मुझे लगता है कि मैं अपना सत्यापन सही कहां छोड़ दूंगा ... – Meryovi

+0

@ जोएल: वे जो विकल्प दिखाते हैं वह नई() बाधा के लिए एकमात्र विकल्प है। पैरामीटर जोड़ने का कोई तरीका नहीं है। –

2

नहीं, सी # में सामान्य हस्ताक्षर के कन्स्ट्रक्टर के लिए जेनेरिक प्रकार को बाधित करने के लिए संभव नहीं है। केवल पैरामीटर रहित कन्स्ट्रक्टर को नए() द्वारा समर्थित किया जाता है।

+1

हालांकि यह एक अच्छा जोड़ा होगा! – Meryovi

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