2016-10-03 5 views
0

私は、次のコード(PointLineCalculatedLine両方がLineを継承)を持つ:エディタは、私はline.init()を呼び出すときについてlineがタイプPointLine/CalculatedLineのものではない文句を言いVB.NETの別の変数にオブジェクトを再割り当てせずにオブジェクトをキャストするにはどうすればよいですか?

For Each line As Lines.Line In lines 

    ''Since both Point and Calculated lines are stored in the same list in the XML files, 
    ''we need to force them back to their original type before using them 
    Select Case line.GetType() 

    Case GetType(Lines.PointLine) 
     line = DirectCast(line, Lines.PointLine) 
     line.init()''ERROR:'init' is not a member of 'PerformanceValidation.EngineValidation.Limits.Components.Lines.Line' 

     myLimitSeries.Add(line.series) 

    Case GetType(Lines.CalculatedLine) 
     line = DirectCast(line, Lines.CalculatedLine) 
     line.init(dataTable)''ERROR:'init' is not a member of 'PerformanceValidation.EngineValidation.Limits.Components.Lines.Line' 
     myLimitSeries.Add(line.series) 
    End Select 
Next 

を。

元のオブジェクトは、後で使用される計算された情報を含むように「初期化」するため、PointLineまたはCalculatedLineにキャストすることが重要です。基本的には、キャストされたLineのコンテナとして機能するPointLineまたはCalculatedLine型の新しい変数を作成したくありません。

私は適切なタイプの新しいラインを作成しようとしましたが(私が上記にしたくないと言ったように)、元のラインを削除して新しいラインをリストに追加しましたが、もちろん、変更されています。

LinePointLineまたはCalculatedLineとして一時的に扱う方法はありますか?

ありがとうございます!

答えて

1

新しいインスタンスを作成する必要はありませんが、参照のために正しいタイプの2番目の変数が必要です。私はあなたが "削除"と言うときに理解しません。キャストすると、両方の変数が同じインスタンスを指しているのでインスタンスを削除しません。

For Each line As Lines.Line In lines 

    Select Case line.GetType() 

    Case GetType(Lines.PointLine) 
     Dim linePoint As Lines.PointLine = DirectCast(line, Lines.PointLine) 

     linePoint.init() 
     myLimitSeries.Add(line.series) 

    Case GetType(Lines.CalculatedLine) 
     Dim lineCalculated As Lines.CalculatedLine = DirectCast(line, Lines.CalculatedLine) 

     lineCalculated.init(dataTable) 
     myLimitSeries.Add(line.series) 
    End Select 
Next 

ここに新しいインスタンスは作成されません。

1つの関数だけを呼び出す場合は、いつでも実行できます。

For Each line As Lines.Line In lines 

    Select Case line.GetType() 

    Case GetType(Lines.PointLine) 
     DirectCast(line, Lines.PointLine).init() 
     myLimitSeries.Add(line.series) 

    Case GetType(Lines.CalculatedLine) 
     DirectCast(line, Lines.CalculatedLine).init(dataTable) 
     myLimitSeries.Add(line.series) 
    End Select 
Next 
+0

そうですね。非常に清潔で、非常にエレガント。ありがとうございました! –

1

コレクションにアイテムを再入力することはできません。コレクションのタイプがコレクション全体に設定されているためです(この例では、行末が1です)。

ソースデータが正しい/必須の形式であるかどうかを判断します。あなたがソースフォーマットに満足していないなら、私はそれを修正します。ソースがそのまま必要な場合は、上のレイヤーの行を扱いますが、確かに別のコレクションが必要になります。 いずれかのタイプの行を別の種類に変換して1つのコレクションに入れることができます。また、IDと型を持つコレクションを1つずつ持つこともできますし、それぞれのコレクションに2つのコレクションを含めることもできます。

+0

です。私が望んでいたものではありませんが、私は新しいコレクションを作成し、初期化されたラインをそれに取り込み、元のコレクションを完全に置き換えました。助けてくれてありがとう! –

関連する問題