2009-07-30 4 views
5

次のスライドオブジェクトのリストがあります。オブジェクトの 'type' varの値に基づいて、リスト内のSlideオブジェクトをアップキャストする必要があります。出来ますか?c#オブジェクトをダウンキャストする方法

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

SectionSlideを拡張し、1つの以上のパラメータを追加します。

+0

私にダウンキャストのような音。とにかく、これを行うには危険です(または設計上の欠陥)。もっと特殊なタイプにダウンキャストすることで、オブジェクトから処理できるよりも多くを期待しています。あなたがダウンキャストの必要性を感じる場合は、インターフェイスの使用を検討してください。 –

+0

これらの状況ではインターフェイスが有用であるとのことで合意しましたが、「決してダウンキャストしない」とは言わないと思います。常に設計上の欠陥ではなく、必ずしも危険なものではありません。 – Allan

答えて

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; 

たものとの差が、最初のものということですslideSectionにキャストできない場合は例外をスローし、2番目の例外はを返しますキャストが不可能な場合。

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

私はこのことができます願っています。

関連する問題