2017-07-25 8 views
-1

のは、私が.NETに正しいクラスのインスタンスがあることを知らせる方法

Class ViewerManager(Of ViewTable) 

を持っており、その内、私はラインで、私はここでは、この

#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 

のようなものを持っている内部のGetを持って

Protected ReadOnly Property StoredView As ViewTable 

を持っているとしましょう

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

私は、BOs.CustomGridBO.GetMemorizedFilterPageTblMemorizedFilterPageインスタンスを返し、この行が実行された場合、ViewTableTblMemorizedFilterPageであることを確かに知っていますので、CTypeの2倍は私にとって不幸なようです。これを何とか簡単にすることはできますか?

EDIT:

コメントセクションでの混乱があったので、私はより詳細な情報を提供する必要があると思います。 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にキャストできないため、あなたの唯一の選択肢は、最初にオブジェクトにキャストすることによってコンパイラを騙すことです。お互いに共通の唯一の基本クラスです。

多くのIfステートメントがある場合は、クラスビューアマネージャ(Of ViewTable)を持つ2つのクラスを基本クラスとして持つと思います。サブクラスはこれらの特定の状況を処理します。

テンプレートの型が列挙型に依存していますが、列挙型がテンプレートの型に基づいていないということも奇妙です。あなたはViewerManager(Of TblMemorizedAEV)を行い、PageIDが0より大きいです。

+0

TblMemorizedFilterPageをTblMemorizedAEVに変換する必要はありません。逆も同様です。オブジェクトをViewTableからTblMemorizedFilterPageに変換する予定がある場合、ViewTableはTblMemorizedFilterPageです。 ViewTableをTblMemorizedAEVに変換する予定がある場合、ViewTableはTblMemorizedAEVです。 PageIDは、私たちがTblMemorizedAEVを持っている場合には適用されないプロパティなので、今のところ他の質問の解答と同等であり、GetTypeを組み合わせる可能性を認識していなかったので、次善策として使用されました私の他の質問を参照してください。 –

+0

@LajosArpadはい、これはあなたがしたいことです。しかし、それはコンパイラーがどのように見えるかではありません。コンパイラは、一方から他方に変換したいと思うので、まずベースオブジェクトに変換する必要があります。 –

+0

TblMemorizedFilterPageをViewTableに偽装して変換する場合、TblMemorizedAEVは完全に廃止されているので、コンパイラはそのようには見えません。この場合、コンパイラはViewTableをTblMemorizedFilterPageに変換しようとしています。この場合、ViewTableはTblMemorizedFilterPageと同じ意味ですが、コンパイラは状況を知らないため、問題が発生しました。オブジェクトにアップキャストして、タイプ。私は、DynamicCastなどのようなものを含むより単純なソリューションがあるのだろうかと思います。 –

関連する問題