2017-07-25 16 views
-1

讓我們假設我有一個如何讓.NET知道我有一個正確的類的實例?

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都是類,具有相同名稱的枚舉值以這些類命名。

+0

GetMemorizedFilterPage的返回值是什麼? –

+0

它返回一個TblMemorizedFilterPage實例,而_StoredView是ViewTable的一個實例,在這種情況下意味着TblMemorizedFilterPage。 –

+0

TblMemorizedFilterPage是枚舉中的一個值。如果GetMemorizedFilterPage返回一個枚舉,那就是爲什麼你不能直接轉換到ViewTable的原因。 –

回答

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.

+0

我不需要將TblMemorizedFilterPage轉換爲TblMemorizedAEV,反之亦然。當我打算將我的對象從ViewTable轉換爲TblMemorizedFilterPage時,ViewTable就是一個TblMemorizedFilterPage。當我打算將ViewTable轉換爲TblMemorizedAEV時,那麼ViewTable就是一個TblMemorizedAEV;如果我們有一個TblMemorizedAEV,PageID是一個不適用的屬性,所以它相當於現在爲其他問題描述的解決方案,並且由於我沒有意識到將GetType是的,看到我的另一個問題。 –

+0

@LajosArpad是的,這是你想要做的。但這不是編譯器看到它的方式。編譯器認爲你想從一個轉換到另一個,這就是爲什麼你需要首先轉換爲一個基礎對象。 –

+0

編譯器無法看到它,因爲當我想將模仿爲ViewTable的TblMemorizedFilterPage轉換時,TblMemorizedAEV完全無法運行。在這種情況下,編譯器希望將ViewTable轉換爲TblMemorizedFilterPage,即使ViewTable與TblMemorizedFilterPage意味着在這種情況下相同,編譯器也不知道情況,因此我遇到了一個問題,通過向上轉換爲Object然後向下轉換爲所需類型。我想知道是否有更簡單的解決方案,涉及類似DynamicCast之類的東西。 –

相關問題