2008-09-11 9 views
11

नहीं, यह जेनेरिक के बारे में कोई सवाल नहीं है।एक्टिवेटर। क्रिएटइंस्टेंस (स्ट्रिंग) और एक्टिवेटर। क्रिएटइंस्टेंस <T>() अंतर

मेरे पास आंतरिक रचनाकारों के साथ कई वर्गों के साथ एक फैक्टरी पैटर्न है (मैं नहीं चाहता कि कारखाने के माध्यम से उन्हें तत्काल नहीं किया जा रहा हो)।

मेरी समस्या यह है कि CreateInstance "इस ऑब्जेक्ट के लिए परिभाषित कोई पैरामीटर रहित कन्स्ट्रक्टर" त्रुटि के साथ विफल रहता है जब तक कि मैं गैर-सार्वजनिक पैरामीटर पर "सत्य" पास नहीं करता।

उदाहरण

// Fails 
Activator.CreateInstance(type); 

// Works 
Activator.CreateInstance(type, true); 

मैं कारखाने यह थोड़ा सरल बनाने के लिए सामान्य है, इस तरह बनाना चाहते थे:

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance<T>(); 
    } 
} 

हालांकि, मैं खोजने में असमर्थ था कि "सही" पारित करने के लिए गैर-सार्वजनिक रचनाकारों (आंतरिक) को स्वीकार करने के लिए पैरामीटर।

क्या मुझे कुछ याद आया या यह संभव नहीं है?

+2

होना चाहिए? – Vivek

उत्तर

20

इस के आसपास पाने के लिए आपको बस जैसे अपने उपयोग को बदल सके:

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance(typeof(T), true); 
    } 
} 

आपका कारखाने पद्धति अभी भी सामान्य हो जाएगा, लेकिन उत्प्रेरक के लिए कॉल सामान्य अधिभार का उपयोग नहीं होगा। लेकिन आपको अभी भी एक ही परिणाम प्राप्त करना चाहिए।

+0

अच्छा कामकाज, लेकिन मुझे यह जानना है कि यह संभव है कि – juan

+0

यदि अधिभार मौजूद नहीं है, तो मुझे नहीं कहना होगा। – Kilhoffer

3

आप पूरी तरह की आवश्यकता होती है कि निर्माता निजी आप कुछ इस तरह की कोशिश कर सकते हो:

public abstract class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return (T)Activator.CreateInstance(typeof(T), true); 
    } 
} 

नहीं तो आप सबसे अच्छा बंद नई बाधा जोड़ने और ऐसा कर रहे हैं:

public abstract class GenericFactory<T> where T : MyAbstractType, new() 
{ 
    public static T GetInstance() 
    { 
     return new T; 
    } 
} 

आप स्क्रैच से प्रत्येक को लिखने के बजाए जेनेरिक फैक्ट्री को अपने सभी कारखानों के लिए बेस क्लास के रूप में उपयोग करने का प्रयास कर रहे हैं?

+0

पहला विकल्प Kilhoffer जैसा ही काम नहीं करेगा, दूसरा() जहां नए प्रकार के सार्वजनिक पैरामीटर की आवश्यकता होती है, जोड़ना नहीं होगा, जो वास्तव में मैं नहीं चाहता हूं – juan

+0

हाँ, उसकी पोस्ट जैसा कि मैं अपना टाइप कर रहा था दिखाई दिया। – rpetrich

0

Activator.CreateInstance (typeof (टी), सच) काम करने के लिए इसके अलावा, टी क्यों नहीं निजी बूलियन चर सही पर सेट के साथ एक parameterless निर्माता को परिभाषित डिफ़ॉल्ट निर्माता