2016-10-03 81 views
0

我有以下代碼(PointLineCalculatedLine既繼承Line):如何在不將對象重新賦值給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 

編輯抱怨line不是類型PointLine/CalculatedLine,當我打電話line.init()

將原始對象轉換爲PointLine或CalculatedLine是很重要的,因爲我「初始化」它們以包含稍後將用到的計算信息。所以基本上,我不想創建一個類型爲PointLine或CalculatedLine的新變量來充當Castted Line的容器。

我試着創建一個適當類型的新行(正如我說的我不想在上面)並刪除原始行並將新行添加到列表中,但當然它抱怨了基礎列表被修改。

有沒有辦法將Line暫時作爲PointLineCalculatedLine而不影響列表?

謝謝!

回答

1

您不需要創建新的實例,但需要爲參考提供正確類型的第二個變量。我不明白當你說「刪除」時,當你施放時,你不會刪除這個實例,因爲這兩個變量都指向同一個實例。

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 

這裏沒有創建新的實例。

如果你只調用一個函數,你可以隨時做。

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行的結尾)。

我會做出決定,無論源數據是否爲正確/所需的格式。如果你對源格式不滿意,我會在那裏解決它。如果你需要這個源代碼,我會在上面的圖層中處理這些線條,但它肯定會需要另一個集合。 您可以將一種類型的行轉換爲另一種類型,並將它們放入一個集合中,或者您可以使用一種ID和類型的集合,以及每種類型的其他兩種集合(然後可以使用源集合)。

+0

我明白了。這不是我所希望的,但我做了一個新的集合,並用初始化的線條填充它,然後完全替換原始集合。謝謝您的幫助! –

相關問題