आप कंस्ट्रक्टर्स सामान्य नहीं कर सकता है, लेकिन आप एक सामान्य स्थिर विधि का प्रयोग कर सकते हैं:
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);
स्रोत
2009-03-31 13:35:47
मैं करूंगा: ताकि आप प्रकार निष्कर्ष का लाभ ले सकते IGenericType को सदस्य var के रूप में सहेजना चाहते हैं, ऐसा करने के लिए मुझे लगता है कि मुझे पूरी कक्षा जेनेरिक को केवल विधि ही नहीं बनाना होगा ...? – CSharpAtl
हां, यदि आपको सदस्य चर के रूप में दृढ़ता से टाइप करने की आवश्यकता है, तो आपको पूरे प्रकार को सामान्य बनाना चाहिए और फिर निर्माता समस्या दूर हो जाती है। –
यह देखने के लिए कि आपके पास कुछ मूलभूत रूप से बेहतर है या नहीं, मेरे द्वारा मेरे डिज़ाइन विचार को चलाने के लिए चाहते हैं। ऐसा नहीं लगता कि मैं इसे इस टिप्पणी में टाइप कर सकता हूं। क्या मैं आपके ब्लॉग पर पोस्ट कर सकता हूं या आपको ईमेल कर सकता हूं? – CSharpAtl