2010-04-20 11 views
10

यहां एक परीक्षण है जो मेरी राय में गुजर रहा है लेकिन नहीं है।ओपन जेनेरिक इंटरफ़ेस प्रकार खुले कार्यान्वयन के बराबर इंटरफ़ेस प्रकार नहीं है?

[TestMethod] 
public void can_get_open_generic_interface_off_of_implementor() 
{ 
    typeof(OpenGenericWithOpenService<>).GetInterfaces().First() 
     .ShouldEqual(typeof(IGenericService<>)); 
} 
public interface IGenericService<T> { } 
public class OpenGenericWithOpenService<T> : IGenericService<T> { } 
  1. ऐसा क्यों नहीं होता है?
  2. Type t = typeof(OpenGenericWithOpenService<>) दिया गया मुझे टाइपफ़ोफ़ (IGenericService <>) कैसे प्राप्त करें?

मैं आम तौर पर उत्सुक हूँ, लेकिन आप सोच रहे हैं कि मैं क्या कर रहा हूँ, मैं एक Structuremap परंपरा है कि कार्यान्वयन के लिए एक वर्ग द्वारा कार्यान्वित सभी इंटरफ़ेस अग्रेषित करता है (एक सिंगलटन के रूप में) लिख रहा हूँ।

+0

प्रश्न क्रैकिंग। जांच कर रहा है :) –

+0

यदि आप वास्तव में परीक्षा उत्तीर्ण करना चाहते हैं, तो आप GUID की तुलना कर सकते हैं। –

उत्तर

7

OpenGenericWithOpenService<T> को लागू नहीं करता है सिर्फ एक मनमानाIGenericService<> - यह एक ही T वर्ग के रूप में के लिए IGenericService<T> लागू करता है।

इस दिखाने के लिए सबसे अच्छा तरीका है वर्ग थोड़ा बदलने के लिए है:

public class OpenGenericWithOpenService<T1, T2> : IGenericService<T1> {} 

अब यह महत्वपूर्ण है कि जब आप से पूछना इंटरफेस यह लागू करता है के लिए, तुम्हें पता है कि यह है कि आप IGenericService<T1> लेकिन (संयोग करने के लिए अलग परिवर्तित कर सकते हैं) IGenericService<T2> या कोई अन्य कार्यान्वयन।

दूसरे शब्दों में, यह पूरी तरह से खुला नहीं है - यह कक्षा के समान प्रकार के तर्क के लिए पिन किया गया है।

मैं जेनेरिक शब्दावली के साथ कभी भी बहुत अच्छा नहीं रहा हूं, लेकिन मुझे आशा है कि आप देखेंगे कि मेरा क्या मतलब है। IGenericService<> एक प्रकार का तर्क देने का इंतजार कर रहा है; इस मामले में आपके पास प्रकार तर्क है - यह सिर्फ एक और प्रकार पैरामीटर होता है!

यहाँ एक परीक्षण है जो पारित होगा:

[TestMethod] 
public void can_get_open_generic_interface_off_of_implementor() 
{ 
    Type[] typeParams = typeof(OpenGenericWithOpenService<>).GetGenericArguments(); 
    Type constructed = typeof(IGenericService<>).MakeGenericType(typeParams); 
    typeof(OpenGenericWithOpenService<>).GetInterfaces().First()    
     .ShouldEqual(constructed); 
} 

आप के बजाय लागू (माना) IGenericService<int> के लिए कक्षा बदलते हैं, तो यह असफल हो जायेगी।

+0

हाँ। यहां इस पर और अधिक पाया गया है: http://stackoverflow.com/questions/511620/generic-types-not-equal यदि मैं 'टाइपऑफ (ओपनजेनरिक विथ ओपन सेवा <>) का उपयोग करता हूं तो परीक्षण पास हो जाता है। GetInterfaces()। पहले()। GetGenericTypeDefinition() ' –

+0

अभी भी काफी नहीं मिलता है कि क्यों 'OpenGenericWithOpenService <>' 'IGenericService <>' लागू नहीं करता है ...? – thecoop

+0

शानदार! मैंने पाया है कि जेनेरिक (खुले या अन्यथा) के प्रतिबिंब अर्थशास्त्र के बारे में तर्क जटिल है। मुझे लगता है कि विषय एक किताब में इलाज का हकदार है। हमम, हम कौन जानते हैं कि ऐसा कर सकता है ... :) – LBushkin

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