2009-07-30 61 views
5

我有以下的幻燈片對象列表。根據對象'type'var的值,我想在列表中上傳Slide對象。可能嗎?c#如何向下傾倒一個對象

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

Section延伸Slide,並增加了一個參數。

+0

聽起來像一個低調給我。無論如何,這是危險的(或設計缺陷)。通過向下轉換爲更專門化的類型,您期望從對象中獲得更多的可能性。如果您覺得需要沮喪,請考慮使用接口。 – 2009-07-30 07:54:54

回答

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; 

但是你不應該那樣做 - 這幾乎總是一個有缺陷的設計的標誌。

1

可簡單地把它:

Section section = (Section) slide; 
9

是的,你可以這樣做:

Section section = (Section)slide; 

...或:

Section section = slide as Section; 

那些之間的區別是第一個將如果slide無法投射到Section會拋出異常,而第二個會返回null如果演員不可能。

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

我希望這有助於。