2017-01-02 5 views
6

में जेनेरिक क्लास में नेस्टेड जेनेरिक क्लास का प्रकार प्राप्त करें मेरी प्रोजेक्ट में मैं निम्न श्रेणी का उपयोग करता हूं: Filter<T>.Checker<U> जिसमें इंटरफ़ेस आईसीएचकर भी है। यह इस तरह दिखता है:सी #

class Filter<T> { 

    public interface IChecker { 
     ... 
    } 

    public class Checker<U> : IChecker { 
     ... 
    } 

    List<IChecker> checkers; 

    ... 

} 

फ़िल्टर वर्ग प्रकार टी की वस्तुओं फिल्टर फिल्टर वर्ग टी जिसमें यू टी में

इस क्षेत्र के प्रकार है में विभिन्न क्षेत्रों की जांच करने के IChecker सूची का उपयोग करता

किसी अन्य वर्ग में किसी अन्य विधि में मैं एक चेकर का उदाहरण बनाना चाहता हूं। उस विधि में टी का प्रकार लेनदेन है, जो संकलन समय पर पता है। यू के प्रकार को केवल टाइप उदाहरण द्वारा जाना जाता है। नीचे दिया गया कोड दिखाता है कि आप सामान्य रूप से टाइप को जानने वाले सामान्य वर्ग का उदाहरण कैसे बनाते हैं।

Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

मैं इस एक छोटा सा आगे ले और निम्न कार्य करना चाहते हैं:

Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

हिस्सा typeof(Filter<Transaction>.Checker<>) संकलन नहीं है। कंपाइलर कहता है: Unexpected use of an unbounded generic name

क्या यह सी # में जेनेरिक क्लास में नेस्टेड जेनेरिक क्लास का प्रकार संभव है?

+2

पहले से ही उत्तर पोस्ट करने के लिए जोड़ने के लिए - यह [MSDN] (https पर दस्तावेज में विस्तार से बताया गया है: //msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx)। पूरे ** नेस्टेड प्रकार ** अनुभाग की जांच करें, विशेष रूप से: * "जेनेरिक प्रकार परिभाषा से जेनेरिक प्रकार परिभाषा से एक सामान्य प्रकार का निर्माण करने के लिए, मेकजेनरिक टाइप विधि को सभी संलग्न प्रकारों के प्रकार तर्क arrays को संयोजित करके बनाई गई सरणी के साथ कॉल करें, बाहरीतम सामान्य प्रकार से शुरू होता है, और नेस्टेड प्रकार के प्रकार तर्क सरणी के साथ समाप्त होता है, यदि उसके पास इसके प्रकार के पैरामीटर हैं। "* – MarcinJuraszek

उत्तर

3

अच्छी जेनरिक आपको सभी या कोई सामान्य तर्क निर्दिष्ट करने की आवश्यकता नहीं है। जब से तुम संकलन समय पर दूसरा तर्क पता नहीं है, आप MakeGenericType को तर्क के रूप में उन दोनों को पारित करने के लिए है:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType); 
object myObject = Activator.CreateInstance(type); 

यद्यपि आप संकलन समय पर प्रकार Transaction पता है, तुम typeof() के माध्यम से निर्दिष्ट करने की आवश्यकता है, लेकिन जो चोट नहीं पहुंचाएगा।

मैंने is ऑपरेटर के माध्यम से सत्यापित किया कि प्रकार के तर्क अपेक्षित क्रम में लागू होते हैं।

4

मुझे लगता है कि आप यहाँ पहली बार सामान्य पैरामीटर टी छोड़ देते हैं और एक सरणी के रूप में दोनों प्रकार के पारित करने के लिए है:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction),objectType);