在VB.net中是否可以测试两种类型是否具有相同的未知继承?

在VB.net中是否可以测试两种类型是否具有相同的未知继承?,vb.net,inheritance,types,Vb.net,Inheritance,Types,是否可以动态标识两个或多个未知类型对象的最接近的公共层次结构或继承?换句话说,我想测试Integer和String是否具有公共层次结构,而不知道由于用户选择,我要测试的对象将是Integer和String。我发现一个C++问题,在这里似乎与我的问题类似: 然而,我不熟悉那里发布的答案的任何VB.net等价物,当我试图翻译它们时,在线翻译人员只会提供一个错误。那么,这在VB.net中首先是可能的吗 据我所知,最接近此操作的是.IsAssignableFrom()函数,但在我的例子中,我不知道首先要

是否可以动态标识两个或多个未知类型对象的最接近的公共层次结构或继承?换句话说,我想测试Integer和String是否具有公共层次结构,而不知道由于用户选择,我要测试的对象将是Integer和String。我发现一个C++问题,在这里似乎与我的问题类似: 然而,我不熟悉那里发布的答案的任何VB.net等价物,当我试图翻译它们时,在线翻译人员只会提供一个错误。那么,这在VB.net中首先是可能的吗

据我所知,最接近此操作的是.IsAssignableFrom()函数,但在我的例子中,我不知道首先要测试的父类/接口/任何对象。上面的功能是我在任何搜索中都会弹出的唯一一个与此问题有远程关联的功能

我需要的上下文在Revit API中;我试图查看用户选择的元素是否具有与对象类型不同的类似层次结构/继承,如果是,则允许执行操作,否则,将显示一个警告对话框

编辑:由于Revit API的性质和我的命令的预期效果,我的插件的用户可以选择模型中的任何内容,而我无法确定我可以使用IsAssignableFrom来比较的许多常见祖先中的哪一个。我可以测试元素类型的(我认为是通用的)公共祖先,但如果选择墙和元素标记,我不希望允许用户运行该命令。我需要找到用户选择的元素的共同祖先,并确认最接近的共同祖先位于层次结构中元素类型的下方

例如,API中的房间标记元素具有如下层次结构:
Object->Element->spacealElementTag->RoomTag
可能有更多的中间继承,但我不打算在API文档中跟踪它们。然后每个元素可能有一个稍微不同的祖先。如果我知道我想测试的基本血统,IsAssignableFrom将非常棒

TnTinMn的回答给出了我正在寻找的解决方案类型。

返回:

当前类型直接从中继承的类型,如果当前类型表示对象类或接口,则为null

使用这些信息,可以定义一个迭代器来枚举继承树

Private Iterator Function SelfAndAncestors(srcType As Type) As IEnumerable(Of Type)
  Do Until srcType Is Nothing
    Yield srcType
    srcType = srcType.BaseType
  Loop
End Function
现在可以使用查找两个祖先枚举之间的继承中的所有公共类型,并返回第一个公共祖先类型

Dim t1 As Type = GetType(Form)
Dim t2 As Type = GetType(UserControl)

Dim highestCommonAncestor As Type = Enumerable.Intersect(SelfAndAncestors(t1), SelfAndAncestors(t2)).First()

对于这种情况,最高的公共祖先是
ContainerControl

IsAssignableFrom
是正确的。你在使用它时有什么问题?如果你知道你比较的是什么父类型,对吗?在我的例子中,我希望采用2+个动态指定的类型,并确定它们是否有一个共同的祖先,而不知道由于用户选择Revit API中的任何元素,该祖先可能是什么。我正在基于类祖先有效地创建一个xor过滤器,而不知道是否存在任何共同祖先。除非我弄错了,否则IsAssignableFrom不适用于此实例。如果需要,我可以编辑我的帖子来澄清这一点。我有点误解了
IsAssignableFrom
将让您知道一种类型是否直接或间接地从另一种类型继承。如果两个类型不相互继承,而是有一个共同的继承根,那么这将没有帮助。