我有以下的幻燈片對象列表。根據對象'type'var的值,我想在列表中上傳Slide對象。可能嗎?c#如何向下傾倒一個對象
foreach(Slide slide in slidePack.slides)
{
if(slide.type == SlideType.SECTION_MARKER)
{
//upcast Slide to Section
}
}
Section
延伸Slide
,並增加了一個參數。
我有以下的幻燈片對象列表。根據對象'type'var的值,我想在列表中上傳Slide對象。可能嗎?c#如何向下傾倒一個對象
foreach(Slide slide in slidePack.slides)
{
if(slide.type == SlideType.SECTION_MARKER)
{
//upcast Slide to Section
}
}
Section
延伸Slide
,並增加了一個參數。
下面是處理該演員的正確方法。
編輯:有些方法可以設計程序以不需要您正在尋找的測試/演員,但是如果遇到需要嘗試將某個C#對象轉換爲某種類型並處理它的不同方式的情況在成功的時候,這絕對是做到這一點的方法。
Section section = slide as Section;
if (section != null)
{
// you know it's a section
}
else
{
// you know it's not
}
Section section = (Section)slide;
但是你不應該那樣做 - 這幾乎總是一個有缺陷的設計的標誌。
可簡單地把它:
Section section = (Section) slide;
是的,你可以這樣做:
Section section = (Section)slide;
...或:
Section section = slide as Section;
那些之間的區別是第一個將如果slide
無法投射到Section
會拋出異常,而第二個會返回null
如果演員不可能。
foreach(Slide slide in slidePack.slides)
{
if(slide.type == SlideType.SECTION_MARKER)
{
Section sec = (Section)slide;
//use sec.SectionProperty
}
}
你可以這樣做,以及如果你只希望/想處理一個單一類型
foreach(Section section in slidePack.slides.OfType<Section>())
{
// Handle the current section object
}
(把這個作爲一個合適的回答,而不是原來的信息的評論中...)
這聽起來像對我很沮喪。無論如何,這是危險的(或設計缺陷)。通過向下轉換爲更專門化的類型,您期望從對象中獲得更多的可能性。如果您覺得需要沮喪,請考慮使用接口。
例子:
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()
}
}
我希望這有助於。
聽起來像一個低調給我。無論如何,這是危險的(或設計缺陷)。通過向下轉換爲更專門化的類型,您期望從對象中獲得更多的可能性。如果您覺得需要沮喪,請考慮使用接口。 – 2009-07-30 07:54:54