2009-07-30 13 views
5

मेरे पास स्लाइड ऑब्जेक्ट्स की निम्न सूची है। ऑब्जेक्ट के 'टाइप' var के मान के आधार पर मैं सूची में स्लाइड ऑब्जेक्ट को अपस्टास्ट करना चाहता हूं। क्या यह संभव है?सी # किसी ऑब्जेक्ट को डाउनकास्ट कैसे करें

foreach(Slide slide in slidePack.slides) 
{ 
    if(slide.type == SlideType.SECTION_MARKER) 
    { 
     //upcast Slide to Section 
    } 
} 

SectionSlide प्रदान करता है और एक और पैरामीटर कहते हैं।

+0

मुझे एक डाउनकास्ट की तरह लगता है। वैसे भी, यह करने के लिए यह खतरनाक (या एक डिजाइन दोष) है। अधिक विशिष्ट प्रकार के लिए डाउनकास्टिंग करके, आप ऑब्जेक्ट से अधिक होने की अपेक्षा कर रहे हैं, इससे संभाल सकने में सक्षम हो सकता है। यदि आपको डाउनकास्ट की आवश्यकता महसूस होती है, तो इंटरफेस का उपयोग करने पर विचार करें। –

+0

सहमत हैं कि इन स्थितियों में से कुछ में इंटरफेस उपयोगी हो सकते हैं, लेकिन मुझे नहीं लगता कि हमें "कभी भी कमजोर नहीं होना चाहिए"। यह हमेशा एक डिजाइन दोष नहीं है, और न ही यह आवश्यक खतरनाक है। – Allan

उत्तर

7

उस कलाकार को संभालने का उचित तरीका यहां दिया गया है।

संपादित करें: प्रोग्रामों को डिज़ाइन करने के तरीके हैं जिन्हें परीक्षण/कलाकार की आवश्यकता नहीं है, लेकिन यदि आप किसी ऐसे मामले में भाग लेते हैं जहां किसी प्रकार के लिए C# ऑब्जेक्ट डालने का प्रयास करना है और इसे अलग-अलग तरीकों से संभालना है सफलता पर, यह निश्चित रूप से ऐसा करने का तरीका है।

Section section = slide as Section; 
if (section != null) 
{ 
    // you know it's a section 
} 
else 
{ 
    // you know it's not 
} 
2
Section section = (Section)slide; 

लेकिन आपको ऐसा नहीं करना चाहिए - यह लगभग हमेशा दोषपूर्ण desgn का संकेत है।

1

सीधे शब्दों में यह डाली:

Section section = (Section) slide; 
9

हाँ, आप ऐसा कर सकते हैं:

Section section = (Section)slide; 

... या:

Section section = slide as Section; 

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

1
foreach(Slide slide in slidePack.slides) 
{ 
    if(slide.type == SlideType.SECTION_MARKER) 
    { 
     Section sec = (Section)slide; 

     //use sec.SectionProperty 
    } 
} 
0

साथ ही आप ऐसा कर सकता है एक ही प्रकार

foreach(Section section in slidePack.slides.OfType<Section>()) 
{ 
    // Handle the current section object 
} 
2

कार्रवाई करने के लिए चाहते हैं, तो आप केवल उम्मीद/(मूल पोस्ट के लिए एक टिप्पणी के बजाय एक उचित जवाब के रूप में यह लाना ...)

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

उदाहरण:

class ClassWithX 
{ 
    public void X() {} 
} 

class ClassWithXY 
{ 
    public void X() {} 

    public void Y() {} 
} 

class Test 
{ 
    public static void Main(string[] args) 
    { 
     ClassWithX x = new ClassWithX(); 
     ((ClassWithXY) x).Y(); // Downcast, but x of type ClassWithX does not have Y() 
    } 
} 

मुझे आशा है कि इस मदद करता है।

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