2009-07-30 11 views
5

Ich habe die folgende Liste von Objektträgern. Basierend auf dem Wert des "type" var des Objekts möchte ich das Slide-Objekt in der Liste aktualisieren. Ist es möglich?C# Wie man ein Objekt niederdrückt

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

SectionSlide erstreckt und fügt einen weiteren Parameter.

+0

Klingt wie ein Niedergeschlagener für mich. Wie auch immer, es ist gefährlich (oder ein Designfehler), dies zu tun. Wenn Sie in einen spezielleren Typ umwandeln, erwarten Sie mehr von dem Objekt, als es möglicherweise verarbeiten kann. Wenn Sie das Gefühl haben, heruntergestuft zu werden, sollten Sie die Verwendung von Schnittstellen in Erwägung ziehen. –

+0

Vereinbart, dass Schnittstellen in einigen dieser Situationen nützlich sein können, aber ich denke nicht, dass wir "niemals niedergeschlagen" sagen sollten. Es ist nicht immer ein Konstruktionsfehler, noch ist es notwendigerweise gefährlich. – Allan

Antwort

7

Hier ist der richtige Weg, um diese Besetzung zu behandeln.

Edit: Es gibt Möglichkeiten, um Programme zu entwerfen, die nicht die Prüfung/Besetzung Sie suchen, aber wenn Sie in einem Fall wo müssen versuchen, ein C# -Objekt auf einen Typ zu werfen und behandeln sie unterschiedliche Möglichkeiten abhängig auf Erfolg, dies ist definitiv der Weg, es zu tun.

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; 

Aber Sie sollten das nicht tun - es ist fast immer ein Zeichen für fehlerhafte Desgn.

1

einfach es Stimmen:

Section section = (Section) slide; 
9

Ja Sie das tun können:

Section section = (Section)slide; 

... oder:

Section section = slide as Section; 

Der Unterschied zwischen denen ist, dass der erste wird eine Ausnahme auslösen, wenn slide nicht in Section umgewandelt werden kann, während die zweitezurückgibtwenn die Besetzung nicht möglich ist.

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

     //use sec.SectionProperty 
    } 
} 
0

Sie dies auch tun könnte, wenn man nur/erwarten wollen einen einzigen Typ

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

verarbeiten (anstelle eines Kommentars zum Original-Post dies als eine richtige Antwort ...)

Das klingt wie ein niedergeschlagener für mich. Wie auch immer, es ist gefährlich (oder ein Designfehler), dies zu tun. Wenn Sie in einen spezielleren Typ umwandeln, erwarten Sie mehr vom Objekt, als es möglicherweise verarbeiten kann. Wenn Sie das Gefühl haben, heruntergestuft zu werden, sollten Sie die Verwendung von Schnittstellen in Erwägung ziehen.

Beispiel:

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() 
    } 
} 

Ich hoffe, das hilft.

Verwandte Themen