2009-03-31 20 views
31

मेरे पास जेनेरिक टाइप इंटरफेस है और जेनेरिक इंटरफेस में लेने के लिए किसी ऑब्जेक्ट का कन्स्ट्रक्टर चाहता है।
तरह:कन्स्ट्रक्टर में सामान्य प्रकार

public Constructor(int blah, IGenericType<T> instance) 
{} 

मैं कोड है कि IGenericType (नियंत्रण के उपयोग उलट) निर्दिष्ट करने के लिए इस वस्तु बनाता है चाहता हूँ। मैंने ऐसा होने का कोई तरीका नहीं देखा है। इसे पूरा करने के लिए कोई सुझाव?

मैं किसी वस्तु की तरह बनाना चाहते हैं:

Constructor varname = new Constructor(1, new GenericType<int>()); 

उत्तर

40

आप कंस्ट्रक्टर्स सामान्य नहीं कर सकता है, लेकिन आप एक सामान्य स्थिर विधि का प्रयोग कर सकते हैं:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance) 

और उसके बाद जो कुछ भी आप कर यदि आवश्यक हो, तो कन्स्ट्रक्टर के बाद की आवश्यकता है। कुछ मामलों में एक और विकल्प एक गैर-जेनेरिक इंटरफ़ेस पेश करना हो सकता है जो सामान्य इंटरफ़ेस विस्तारित करता है।

संपादित करें: टिप्पणी के अनुसार ...

आप नव निर्मित वस्तु में तर्क को बचाने के लिए चाहते हैं, और आप एक जोरदार टाइप किया रास्ते में ऐसा करना चाहते हैं, तो प्रकार सामान्य रूप में अच्छी तरह से होना चाहिए ।

उस बिंदु निर्माता समस्या दूर हो जाने पर

, लेकिन आप एक गैर सामान्य प्रकार में वैसे भी एक स्थिर सामान्य विधि रखना चाहते हो सकता है:

public static class Foo 
{ 
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance) 
    { 
     return new Foo<T>(instance); 
    } 
} 

public class Foo<T> 
{ 
    public Foo(IGenericType<T> instance) 
    { 
     // Whatever 
    } 
} 

... 

IGenericType<string> x = new GenericType<string>(); 
Foo<string> noInference = new Foo<string>(x); 
Foo<string> withInference = Foo.CreateInstance(x); 
+0

मैं करूंगा: ताकि आप प्रकार निष्कर्ष का लाभ ले सकते IGenericType को सदस्य var के रूप में सहेजना चाहते हैं, ऐसा करने के लिए मुझे लगता है कि मुझे पूरी कक्षा जेनेरिक को केवल विधि ही नहीं बनाना होगा ...? – CSharpAtl

+0

हां, यदि आपको सदस्य चर के रूप में दृढ़ता से टाइप करने की आवश्यकता है, तो आपको पूरे प्रकार को सामान्य बनाना चाहिए और फिर निर्माता समस्या दूर हो जाती है। –

+0

यह देखने के लिए कि आपके पास कुछ मूलभूत रूप से बेहतर है या नहीं, मेरे द्वारा मेरे डिज़ाइन विचार को चलाने के लिए चाहते हैं। ऐसा नहीं लगता कि मैं इसे इस टिप्पणी में टाइप कर सकता हूं। क्या मैं आपके ब्लॉग पर पोस्ट कर सकता हूं या आपको ईमेल कर सकता हूं? – CSharpAtl

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