pma*_*kni 3 vb.net inheritance types
是否可以动态标识最接近的公共层次结构或两个或多个未知类型对象的继承?换句话说,我想测试例如Integer和String是否具有相同的层次结构,而又不知道由于用户的选择我正在测试的对象将是Integer和String。我发现发布了一个C ++问题,看起来与这里的问题类似:检查两种类型是否具有相同的模板 但是,我不熟悉在那里发布的答案的任何VB.net等效项,并且在线翻译人员在出现以下错误时会提供错误提示:我试图翻译它们。那么首先在VB.net中甚至有可能吗?
我所知道的最接近此操作的是.IsAssignableFrom()函数,但就我而言,我不知道首先要对父类/接口/进行什么测试。以上功能是我进行任何搜索时都弹出的与此问题甚至是远程相关的唯一内容。
我需要的上下文在Revit API中;我正在尝试查看用户选择的元素是否具有类似于“对象类型”的类似层次结构/继承关系,如果可以,则允许执行操作,否则,给出警告对话框。
编辑:由于Revit API的性质和命令的预期效果,我插件的用户可以在模型中选择任何内容,而我无法确定我可能要寻找的许多共同祖先使用IsAssignableFrom比较。我可以测试Element类型的(我认为是通用的)通用祖先,但是如果您选择一堵墙和一个element标签,我不想允许用户运行该命令。我需要找到用户选择的元素的公共祖先,并确认最接近的公共祖先在层次结构中的Element类型下。
例如,API中的room tag元素具有类似这样的层次结构:
Object -> Element -> SpatialElementTag -> RoomTag
可能会有更多的中间继承,但是我不会在API文档中进行跟踪。然后每个元素的祖先可能会略有不同。如果我知道我想测试的基础血统,IsAssignableFrom将会很棒。
TnTinMn的答案为我提供了所需的解决方案类型。
该Type.BaseType物业的回报:
当前Type直接继承的Type;如果当前Type表示Object类或接口,则为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
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用Enumerable.Intersect方法在两个祖先枚举之间的继承关系中查找所有公共类型,并返回第一个公共祖先类型。
Dim t1 As Type = GetType(Form)
Dim t2 As Type = GetType(UserControl)
Dim highestCommonAncestor As Type = Enumerable.Intersect(SelfAndAncestors(t1), SelfAndAncestors(t2)).First()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,最高的共同祖先是ContainerControl。