2011-09-18 6 views
5

के लिए ऑपरेटर मैं "है" ऑपरेटर एक निश्चित वर्ग से ढूँढें:"है" - प्रकार

for(int i=0; i<screens.Count; i++){ 
    if(screen is ScreenBase){ 
    //do something... 
    } 
} 

इस रूप में यह है कि ScreenBase से विरासत किसी भी वर्ग नहीं बल्कि आधार वर्ग पाता है विशेष रूप से ठीक काम करता है ScreenBase।

मैं भी ऐसा ही करने के लिए जब मैं केवल प्रकार जानते हैं और वर्ग का दृष्टांत नहीं करना चाहती चाहते हैं:

Type screenType = GetType(line); 
if (screenType is ScreenBase) 

लेकिन इस comparsion एक चेतावनी के रूप में यह "प्रकार" वर्ग के लिए की तुलना करेंगे पैदा करता है ।

मुझे पता है कि एकमात्र विकल्प == टाइपऑफ के साथ तुलना करना होगा, लेकिन यह केवल सटीक प्रकार के लिए परीक्षण करेगा, न कि विरासत वाले लोगों के लिए। क्या "है" ऑपरेटर जैसा समान व्यवहार प्राप्त करने का कोई तरीका है लेकिन टाइप-क्लास द्वारा वर्णित प्रकार के लिए?

उत्तर

5

देख रहे हैं आप चाहते हैं विशेष रूप से जानते हैं कि यह प्रकार से निकला है, Type.IsSubclassOf() का उपयोग करें। यह इंटरफेस के लिए काम नहीं करेगा।

Type screenType = GetType(line); 
if (screenType.IsSubclassOf(typeof(ScreenBase))) 
{ 
    // do stuff... 
} 

अन्यथा अगर आप जानना चाहते हैं कि प्रकार एक खास प्रकार के एक चर को सौंपा जा सकता है चाहता हूँ, Type.IsAssignableFrom() का उपयोग करें। यह इंटरफेस के लिए काम करेगा।

Type screenType = GetType(line); 
if (typeof(ScreenBase).IsAssignableFrom(screenType)) // note the usage is reversed 
{ 
    // do stuff... 
} 

ध्यान दें कि आप आवश्यक रूप से किसी प्रकार वस्तु की जरूरत नहीं है यह निर्धारित करने के लिए, आप Type.IsInstanceOfType() का उपयोग कर वस्तु का एक उदाहरण के साथ ऐसा कर सकते हैं करें। यह IsAssignableFrom() की तरह कम या ज्यादा व्यवहार करेगा।

if (typeof(ScreenBase).IsInstanceOfType(line)) // note the usage is reversed 
{ 
    // do stuff... 
} 
11

मुझे पता है कि एकमात्र विकल्प == टाइपऑफ के साथ तुलना करना होगा, लेकिन यह केवल सटीक प्रकार के लिए परीक्षण करेगा, न कि विरासत वाले लोगों के लिए। क्या "है" ऑपरेटर जैसे समान व्यवहार प्राप्त करने का कोई तरीका है लेकिन टाइप-क्लास द्वारा वर्णित प्रकार के लिए?

GetType(line) एक प्रकार देता है, तो (मैं एक बेहतर नाम उस के लिए, सलाह देते हैं Btw), आप Type.IsAssignableFrom उपयोग कर सकते हैं:

if (typeof(ScreenBase).IsAssignableFrom(GetType(line))) 
{ 
} 
संबंधित मुद्दे