如何让.NET知道我有一个正确的类的实例?

时间:2017-07-25 14:36:58

标签: vb.net class templates

假设我有一个

Class ViewerManager(Of ViewTable)

在里面,我有一个

Protected ReadOnly Property StoredView As ViewTable

里面有一个Get我有这样的东西

#Region "View Object Properties"

    Enum ViewerManagerTemplate
        Unkown = 1
        TblMemorizedFilterPage = 2
        TblMemorizedAEV = 3
    End Enum

    Protected _ManagerTemplate As ViewerManagerTemplate = ViewerManagerTemplate.Unkown
    Protected ReadOnly Property ManagerTemplate As ViewerManagerTemplate
        Get
            If _ManagerTemplate = ViewerManagerTemplate.Unkown Then
                If PageID > 0 Then
                    _ManagerTemplate = ViewerManagerTemplate.TblMemorizedFilterPage
                Else
                    _ManagerTemplate = ViewerManagerTemplate.TblMemorizedAEV
                End If
            End If
            Return _ManagerTemplate
        End Get
    End Property

    Protected InitializedStoredView As Boolean = False
    Protected _StoredView As ViewTable = Nothing
    Protected ReadOnly Property StoredView As ViewTable
        Get
            If Not InitializedStoredView Then
                InitializedStoredView = True
                Select Case ManagerTemplate
                    Case ViewerManagerTemplate.TblMemorizedFilterPage
                        If PageObject.StoredViewID > 0 Then
                            _StoredView = CType(CType(BOs.CustomGridBO.GetMemorizedFilterPage(PageObject.StoredViewID), Object), ViewTable)
                        End If
                End Select
            End If
            Return _StoredView
        End Get
    End Property
#End Region

这里,在

_StoredView = CType(CType(BOs.CustomGridBO.GetMemorizedFilterPage(PageObject.StoredViewID), Object), ViewTable)

我确信BOs.CustomGridBO.GetMemorizedFilterPage会返回TblMemorizedFilterPage个实例,我确信如果执行此行,那么ViewTable也是TblMemorizedFilterPage,因此双CType似乎对我来说是一种矫枉过正。我能以某种方式简化这个吗?

编辑:

由于评论部分存在混淆,我认为我需要提供更多信息。 TblMemorizedFilterPageTblMemorizedAEV都是类,具有相同名称的枚举值以这些类命名。

1 个答案:

答案 0 :(得分:0)

当ViewTable为TblMemorizedAEV时,您别无选择。然后那条线看起来像。

_StoredView = CType(CType(BOs.CustomGridBO.GetMemorizedFilterPage(PageObject.StoredViewID), Object), TblMemorizedAEV)

因为您无法将TblMemorizedFilterPage强制转换为TblMemorizedAEV。您唯一的选择是首先将编译器转换为Object来欺骗编译器。哪个是彼此共有的唯一基类。

如果你有很多If语句,我会考虑使用Class ViewerManager(Of ViewTable)作为基类。子类将处理这些特定情况。

我也觉得很奇怪,模板类型依赖于枚举,但枚举不是基于模板类型。你做什么ViewerManager(Of TblMemorizedAEV)和PageID大于0。