2010-04-27 111 views
0

我正在使用的应用程序具有一个名为RSChild的通用父窗体,用于执行一些操作,具体取决于它所包含的控件是否在MdiTabManager中或内部它自己的模态形式。然后,实际的用户控件包含在从被调用的对象编辑(我们允许编辑的对象)接口继承。在我的代码中,我正在这样做。VB .NET DirectCast和类型反射

Public Function doesTabExist(ByVal id As Integer, ByVal recordType As Enums.eRecordType) As Boolean 
     Dim alikePages As Object = (From tabs In DirectCast(Control.FromHandle(MainForm.SharedHandle), MainForm).XtraTabbedMdiManager1.Pages Where DirectCast(tabs.MdiChild, RSChild).RSObject.RecordType = recordType Select tabs) 
     For Each page As DevExpress.XtraTabbedMdi.XtraMdiTabPage In alikePages 
      Select Case recordType 
       Case Enums.eRecordType.Doctor 
        If id = DirectCast(castTabPageToRSChild(page).RSObject, UI.Doctor).ID Then 
         pageToActive(page) 
         Return True 
        End If 
'rest of the cases so the case block is repeated 10 times' 

End Function 

而且我castTabPageToRSChild(页)是一个lambda功能这样的

Dim castTabPageToRSChild As Func(Of DevExpress.XtraTabbedMdi.XtraMdiTabPage, RSChild) = Function(page) DirectCast(page.MdiChild, RSChild) 

所以我的问题是,我有大约10 case语句,都是因为我似乎无法找到一种方法来使用反射来获取RSObject对象的底层类型。所以我有整个If块重复一遍又一遍。我试过castTabPageToRSChild(page)RSObject.GetType并在DirectCast中使用它,我也尝试创建另一个与之分开的对象,并做同样的事情。

我的代码按预期工作我只是想看看是否有一种我没有很多复制代码的方式。我的目标是做类似

For Each page As XtraMdiTabPage In alikePages 
    If id = DirectCast(castTabPageToRSchild(page).RSObject, castTabPageToRSChild(page).RSObject.GetType).Id Then Return True 
Next 

但是我有一种感觉,这是不可能的,因为的DirectCast行为。

回答

1

改用TryCast。如果对象不是预期的类型,它将返回Nothing。

+0

这完全不是问题。我需要能够将类型投射到。 – msarchet 2010-04-27 20:37:49

+0

对不起,这没有意义。一个对象已经知道它是什么类型。你的代码片段对我来说不够清晰,无法帮助你做你正在寻找的东西。 – 2010-04-27 20:49:13

+0

RSChild.RSObject是一个包含对象的属性,我需要为该直播的第二个参数获取该对象的类型。 – msarchet 2010-04-27 21:06:48