如何在不将其重新分配给VB.NET中的另一个变量的情况下转换对象?

时间:2016-10-03 10:33:13

标签: vb.net casting type-conversion

我有以下代码(PointLineCalculatedLine都继承Line):

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类型的新变量来充当铸造线的容器。

我尝试创建一个相应类型的新行(正如我之前所说,我不想在上面)并删除原始行并将新行添加到列表中但当然,它抱怨基础列表是修改。

我是否可以暂时将Line视为PointLineCalculatedLine,而不会影响列表?

谢谢!

2 个答案:

答案 0 :(得分:1)

您无法在集合中重新输入项目,因为为整个集合设置了类型(在您的示例中,它是第1行的结尾)。

我是否决定源数据是否采用正确/必需的格式。如果您对源格式不满意,我会在那里修复它。如果你需要源代码,我会处理上面一层中的线条,但它肯定需要另一个集合。 您可以将一种类型的行转换为另一种类型并将它们放入一个集合中,或者您可以拥有一个具有一些ID和类型的集合,以及每种类型的另外两个集合(您可以使用源集合)。

答案 1 :(得分: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