2009-07-30 12 views
5

Tengo la siguiente lista de objetos de diapositiva. En función del valor de var del tipo "tipo" del objeto, quiero subir el objeto Slide en la lista. ¿Es posible?C# Cómo abatir un objeto

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

Section extiende Slide y añade un parámetro más.

+0

Suena como un abatido para mí. De todos modos, es peligroso (o un defecto de diseño) hacer esto. Al bajar a un tipo más especializado, espera más del objeto de lo que puede manejar. Si sientes la necesidad de abatir, considera usar interfaces. –

+0

Acordé que las interfaces pueden ser útiles en algunas de estas situaciones, pero no creo que debamos decir "nunca abatido". No siempre es un defecto de diseño, ni es necesariamente peligroso. – Allan

Respuesta

7

Aquí está la forma correcta de manejar ese elenco.

Editar: Hay formas de diseñar programas para que no necesiten la prueba/conversión que está buscando, pero si se encuentra con un caso donde se necesita intentar convertir un objeto C# y manejarlo de diferentes maneras en el éxito, esta es definitivamente la manera de hacerlo.

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; 

Pero no deberías hacer eso, es casi siempre un signo de error en el diseño.

1

simplemente echarlo:

Section section = (Section) slide; 
9

sí se puede hacer eso:

Section section = (Section)slide; 

... o:

Section section = slide as Section; 

La diferencia entre ellos es que el primero se lanzar una excepción si slide no se puede convertir a Section, mientras que el segundo devolverá null si el yeso no es posible.

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

     //use sec.SectionProperty 
    } 
} 
0

Se podría hacer esto también si espera/sólo desea procesar un solo tipo

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

(Poniendo esto como una respuesta adecuada en lugar de un comentario en el post original ...)

Esto suena como un abatido para mí. De todos modos, es peligroso (o un defecto de diseño) hacer esto. Al bajar a un tipo más especializado, espera más del objeto de lo que puede manejar. Si sientes la necesidad de abatir, considera usar interfaces.

Ejemplo:

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

espero que esto ayude.

Cuestiones relacionadas