2014-04-25 9 views
6

मैं एक विस्तार विधि है कि जाँच करता है लिखने के लिए यदि एक वस्तु टीएक्सटेंशन विधि की जाँच करने के

के उप वर्ग

यहाँ है कोशिश कर रहा हूँ मैं क्या किया है, लेकिन दृश्य स्टूडियो द्वारा स्वीकार नहीं ।

public static bool IsChildOf<T>(this object obj) 
{ 
    return (typeof(obj).IsSubclassOf(typeof(T))); 
} 

[Test()] 
public void IsChildOfTest() 
{ 
    var dog = new Dog(); 
    var isAnimal = dog.IsChildOf<Animal>(); 
    Assert.That(isAnimal); 
} 

कोई विचार मैं इसे कैसे लिख सकता हूं?

+1

साइड नोट: "बच्चे कक्षा" और "माता-पिता वर्ग" मामले में आप इसे का उपयोग किया है सीधे अपने परीक्षण तो कैसा लगेगा निराश हैं आपको इसके बजाय "व्युत्पन्न" कहना चाहिए। एक कार वाहन का बच्चा नहीं है; एक कार एक वाहन से निकलती है। मैं इसके बजाय आपकी विधि "DerivesFrom से " नाम दूंगा। – dcastro

+0

मैं सहमत हूं। संबंधों के बजाय "एक" संबंधों के लिए "माता-पिता" संबंधों के लिए बच्चे/अभिभावकीय शर्तों को आरक्षित करें। विशेष रूप से सूचियों या पेड़ जैसे पुनरावर्ती संबंधों में। – weston

+0

टिप्पणियां: 'टाइपऑफ (एक्स)' को 'X' को एक प्रकार (जैसे आपकी' टी') की आवश्यकता होती है, न कि मूल्य या अभिव्यक्ति (जैसे आपकी 'ओबीजे')। क्या आप जानते हैं कि 'IsSubclassOf' गलत है अगर किसी प्रकार का इंटरफ़ेस या मान प्रकार है, और यदि दोनों वर्ग समान हैं? शायद आप 'IsAssignableFrom' चाहते थे? हालांकि, सी # कीवर्ड 'है' का उपयोग करना संभवतः आसान है। वेस्टन के जवाब देखें। –

उत्तर

6

के स्थान पर Assert.IsTrue का उपयोग तुम बस is उपयोग कर सकते हैं। लेकिन नोट करें कि is बिल्कुल IsSubclassOf जैसा नहीं है। विवरण के लिए जेपे की उत्कृष्ट टिप्पणी देखें और मेरे पास भी एक उदाहरण है।

एक तरफ ध्यान दें, मुझे नहीं लगता कि जावा कुछ कारणों से इस तरह के सामान्य मामले में instanceof समकक्ष की अनुमति देता है, लेकिन यह सी # में ठीक है। यानी .:

public static bool IsChildOf<T>(this object obj) 
{ 
    return obj is T; 
} 

फिर इस यह इतना तुच्छ यह पाठकों is सीधे से एक विस्तार विधि का उपयोग करने के लिए और अधिक भ्रामक है कि बनाता है।

[Test()] 
public void IsChildOfTest() 
{ 
    var dog = new Dog(); 
    var isAnimal = dog is Animal; 
    Assert.That(isAnimal); 
} 

is और IsSubclassOf के बीच मतभेद की एक मिसाल है:

[Test] 
public void IsChildOfTest() 
{ 
    var dog = new Dog(); 
    Assert.False(dog.GetType().IsSubclassOf(typeof(Dog))); 
    Assert.True(dog is Dog); 
} 
+3

'is' का उल्लेख करने के लिए उपरोक्त। यह 'Type.IsSubclassOf' के बराबर नहीं है। कुछ मतभेद: यदि 'टी' * समान * वर्ग 'ओबीजे' के रन-टाइम प्रकार के रूप में है, तो' सत्य 'और' IsSubclassOf' कहता है 'झूठा' कहता है। यदि 'टी' एक इंटरफ़ेस है, तो 'है' चेक '' ओब्ज' उस 'इंटरफ़ेस' का प्रतिनिधित्व करता है, जबकि 'IsSubclassOf'' केवल 'झूठा' कहता है। यदि 'ओब्जे' का रन-टाइम प्रकार एक (बॉक्सिंग) मान प्रकार है, तो' Is'ubclassOf' के दौरान अपेक्षित चेक 'है' नहीं कहता है। 'जेनिक्स' में सह-और contravariance भी मानता है, उदाहरण के लिए 'IENumerable ' कुछ भी है 'IENumerable ' (देखें 'IENumerable ')। –

+0

@ जेपे स्टेग नील्सन, बहुत अच्छी बात यह है कि यह बराबर नहीं है। गलतफहमी के मामले में यह स्पष्ट करने के लिए अच्छा है। और वास्तव में, प्रस्तावित नाम IsChildOf के बावजूद, ओपी इन भेदों का इरादा नहीं रख सकता है। –

+0

@JeppeStigNielsen धन्यवाद, यह बहुत महत्वपूर्ण जानकारी है जिसे मैंने याद किया!मुझे लगता है कि 'is'' Type.IsAssignableFrom' – weston

6

उपयोग GetTypetypeof के बजाय आप प्रकार का एक उदाहरण है जब:

public static bool IsChildOf<T>(this object obj) 
{ 
    return (obj.GetType().IsSubclassOf(typeof(T))); 
} 
5
public static Boolean IsChildOf<T>(this Object obj) 
{ 
    // Don't forget to handle obj == null. 
    return obj.GetType().IsSubclassOf(typeof(T)); 
} 
+0

सरल अभिव्यक्ति 'ओबीजे टी' विस्फोट नहीं करता है अगर 'obj'' null' है (यह सिर्फ 'झूठी' का मूल्यांकन करता है)। वेस्टर्न के जवाब पर मेरी टिप्पणी में 'is' के अन्य फायदे देखें। –

2
public static bool IsChildOf<T>(this object obj) 
    { 
     return obj != null && (obj.GetType().IsSubclassOf(typeof(T))); 
    } 

भी Assert.That

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