在运行时创建和操作不同类型对象的实例,只知道类型名称

时间:2014-09-13 20:17:34

标签: vb.net

我想创建一个继承的表单,用于显示数据库中不同表的信息,有四个按钮(关闭,新建,编辑,删除)。但由于显示的信息可能每次都来自不同的表,因此单击“删除”将意味着根据我打开的表删除不同类型的对象。我已经实现了New按钮和Close,一切正常。这是代码。

我创建了一个类PubliTypes,我把它放了

    Public Enum OBJECT_TYPE
    Program
    Student
    Level
    SchoolYear
    End Enum

    Public Function GetObjectTypes(ByVal objectT As PublicTypes.OBJECT_TYPE) As Object

    Select Case objectT

        Case PublicTypes.OBJECT_TYPE.Level
            Return New Level
        Case PublicTypes.OBJECT_TYPE.SchoolYear
            Return New SchoolYear
        Case PublicTypes.OBJECT_TYPE.Program
            Return New Program
        Case PublicTypes.OBJECT_TYPE.Student
            Return New Student
    End Select
    Return Nothing
End Function

我在继承中创建2个属性来存储当前显示的对象(程序,学生等)的名称(字符串),我将其称为ManagedObject,另一个属性存储有关selectedItem的完整信息,它的类型为managedObject

问题是例如,如果显示学生列表,并且用户单击“删除”,我如何访问学生成员以删除特定学生(我已经实施了课程并且工作正常。现在假设所选对象是程序或者schoolYear。如何将SelectedItem强制转换为ManagedOBject并实现它?(managedOBject类型的对象是程序,学生等)

1 个答案:

答案 0 :(得分:0)

也许你可以让这些类实现一个接口。那你就有了更多的类型安全性。从那时起,Object并不是一件好事。在发布的代码中,您将接口作为返回类型。

如果对象的类实现此接口的知识不够,则可以使用TypeOf Is运算符测试类型。但是,您无法使用TypeOf IsNot,但解决方法很简单。

有了这个,您可以获得以下类型:

If TypeOf objectT Is Level Then
    ' Your Code
ElseIf TypeOf objectT Is SchoolYear
    '...
End If

您的代码通常以

开头
Dim objectTAsLevel As Level = CType(objectT, Level)

你应该使用

Dim objectTAsLevel As Level = TryCast(objectT, Level)
Dim objectAsSchoolYear = TryCast(objectT, SchoolYear)

If objectTAsLevel IsNot Nothing Then
    ' Level stuff
ElseIf objectAsSchoolYear IsNot Nothing Then
    ' ...
End If

在任何类型检查之前然后测试,如果新变量是Nothing。如果类型转换不顺利,TryCast将返回Nothing。

毕竟,如果你使用 Roslyn 或者不介意安装它,你可以这样做:

Select Case objectT
    Case lvl As Level
        ' Your code here.
    Case year As SchoolYear

    Case prog As Program

    Case stdnt As Student ' When codition

    Case Else
        ' Error message?
End Select

这类似于Try块。您甚至可以使用When来检查Boolean条件。