2009-07-30 9 views
5

J'ai la liste suivante d'objets de diapositive. Sur la base de la valeur de var 'type' de l'objet, je veux monter l'objet Slide dans la liste. C'est possible?C# Comment redescendre un objet

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

Section étend Slide et ajoute un paramètre supplémentaire.

+0

Ça me semble un downcast. Quoi qu'il en soit, c'est dangereux (ou un défaut de conception) de le faire. Par downcasting à un type plus spécialisé, vous attendez plus de l'objet que ce qu'il peut être capable de gérer. Si vous ressentez le besoin de baisser, envisagez d'utiliser des interfaces. –

+0

Nous avons convenu que les interfaces peuvent être utiles dans certaines de ces situations, mais je ne pense pas que nous devrions dire «jamais baissé». Ce n'est pas toujours un défaut de conception, ni nécessairement dangereux. – Allan

Répondre

7

Voici la bonne façon de gérer ce moulage. Edit: Il existe des moyens de concevoir des programmes qui n'ont pas besoin du test/casting que vous recherchez, mais si vous rencontrez un cas où vous devez essayer de convertir un objet C# en un type et le gérer de différentes manières selon en cas de succès, c'est certainement la façon de le faire.

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; 

Mais vous ne devriez pas faire cela - c'est presque toujours un signe de desgn défectueux.

1

Il suffit de jeter:

Section section = (Section) slide; 
9

Oui, vous pouvez le faire:

Section section = (Section)slide; 

... ou:

Section section = slide as Section; 

La différence entre celles-ci est que le premier sera lancer une exception si slide ne peut pas être converti en Section, tandis que le second renvoie null si la distribution n'est pas possible.

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

     //use sec.SectionProperty 
    } 
} 
0

Vous pouvez le faire aussi bien si vous attendez que/voulez traiter un seul type

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

(Mettre cela comme une réponse appropriée au lieu d'un commentaire au message original ...)

Cela me semble être un downcast. Quoi qu'il en soit, c'est dangereux (ou un défaut de conception) de le faire. Par downcasting à un type plus spécialisé, vous attendez plus de l'objet que ce qu'il peut être capable de gérer. Si vous ressentez le besoin de baisser, envisagez d'utiliser des interfaces.

Exemple:

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

J'espère que cela aide.

Questions connexes