Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何让.NET知道我有一个正确类的实例?_Vb.net_Class_Templates - Fatal编程技术网

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

Vb.net 如何让.NET知道我有一个正确类的实例?,vb.net,class,templates,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

让我们假设我有一个

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.getmemoredfilterpage
将返回一个
TblMemorizedFilterPage
实例,并且我确信如果执行这一行,那么
ViewTable
也是
TblMemorizedFilterPage
,因此双
CType
对我来说似乎是一种过度的杀伤力。我能简化一下吗

编辑:


由于评论部分存在混乱,我想我需要提供进一步的信息
TblMemorizedFilterPage
TblMemorizedAEV
都是类,具有相同名称的枚举值以这些类命名。

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

_StoredView = CType(CType(BOs.CustomGridBO.GetMemorizedFilterPage(PageObject.StoredViewID), Object), TblMemorizedAEV)
因为你不能将TblMemorizedFilterPage转换为TblMemorizedAEV。您唯一的选择是通过先将编译器强制转换为对象来欺骗编译器。这是彼此唯一共同的基类

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


我还发现很奇怪,模板类型依赖于枚举,但枚举不基于模板类型。ViewerManager(属于TblMemorizedAEV)的PageID大于0时,您要执行什么操作。

GetMemoredFilterPage的返回值是多少?它返回一个TblMemorizedFilterPage实例,而_StoredView是ViewTable的一个实例,在本例中,这意味着TblMemorizedFilterPage.TblMemorizedFilterPage是枚举中的一个值。如果GetMemoredFilterPage返回枚举,这就是为什么不能直接强制转换到ViewTable。TblMemorizedFilterPage是枚举中的一个值,但也是类的名称。当我提到“TblMemorizedFilterPage实例”时,我指的是实例化的对象,具有TblMemorizedFilterPage类。但是,如果这个问题中的枚举值让您感到困惑,我可以重命名它们。类TblMemorizedFilterPage继承(或实现)了ViewTable吗?我不需要将TblMemorizedFilterPage转换为TblMemorizedAEV,反之亦然。当我打算将对象从ViewTable转换为TblMemorizedFilterPage时,ViewTable就是TblMemorizedFilterPage。当我打算将ViewTable转换为TblMemorizedAEV时,那么ViewTable就是TblMemorizedAEV;PageID是一个属性,如果我们有一个TblMemorizedAEV,它就不适用,因此它相当于现在为另一个问题描述的解决方案,并且被用作第二个最佳解决方案,因为我不知道将GetType和is组合起来的可能性,请参见我的另一个问题。@LajosArpad是的,这是您想要做的。但编译器并不是这么看的。编译器认为您需要从一个转换到另一个,这就是为什么您需要首先转换为基本对象。编译器无法以这种方式看到它,因为当我要将TblMemorizedFilterPage模拟为ViewTable时,TblMemorizedAEV就完全停止工作了。在本例中,编译器希望将ViewTable转换为TblMemorizedFilterPage,即使ViewTable在本例中的含义与TblMemorizedFilterPage相同,编译器也不知道这种情况,因此我遇到了一个问题,通过向上转换为Object,然后向下转换为所需的类型来解决。我想知道是否有一个更简单的解决方案,包括DynamicCast之类的东西。