我想创建一个继承的表单,用于显示数据库中不同表的信息,有四个按钮(关闭,新建,编辑,删除)。但由于显示的信息可能每次都来自不同的表,因此单击“删除”将意味着根据我打开的表删除不同类型的对象。我已经实现了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类型的对象是程序,学生等)
答案 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
条件。