Inheritance 比较UIExtSelectionView和UIView的奇怪类型检查结果

Inheritance 比较UIExtSelectionView和UIView的奇怪类型检查结果,inheritance,uiview,xamarin.ios,Inheritance,Uiview,Xamarin.ios,我正在使用其子视图属性遍历UITextView。然后,我使用 if(element.GetType() != typeof(UIView)) 由于某些奇怪的原因,UITextView的某些子类型(例如UITextSelectionView的计算结果为true) 据我所知,派生类的计算结果应该为false——那么这里发生了什么呢 在我的例子中,我得到了UIContainerView,它是UITextView的一部分,对它进行迭代可以得到一个UITextSelectionView 两者都以各自

我正在使用其子视图属性遍历UITextView。然后,我使用

if(element.GetType() != typeof(UIView))
由于某些奇怪的原因,UITextView的某些子类型(例如UITextSelectionView的计算结果为true)

据我所知,派生类的计算结果应该为false——那么这里发生了什么呢

在我的例子中,我得到了UIContainerView,它是UITextView的一部分,对它进行迭代可以得到一个UITextSelectionView

两者都以各自的类型显示,但

view.GetType().FullName
element.GetType().FullName
都返回UIView

检查类型“for real”的唯一方法似乎是将其强制转换为object:

> ((object)view).Class.Name "_UITextContainerView"

> ((object)element).Class.Name "UITextSelectionView"
对我来说,这与使用GetType()和typeof完全不同

不幸的是,xamarin的UIKit api中没有条目:

我在apple dev上也发现了这一点:

但我似乎在这里找到了一个头文件,它表明它是按照我的想法派生的:

在iOS中有几种私有类型,
UITextSelectionView
听起来像一种。私有类型没有文档记录(由苹果公司提供),不受Xamarin的约束(这将导致应用程序被拒绝),并且在不同的iOS版本中也可能有所不同

您所做的是对<>代码> uiVIEW/COD>的具体检查,它不考虑子类(公共或私有)。 这可能不是你真正想要的(希望如此)。如果您想过滤<代码> uiVIEW/COD>,您应该考虑使用如下代码:

if (!(element is UIView))

因为这将考虑任何代码类<代码> uiVIEW/COD>,并且对未来iOS版本中可能发生的内部更改更加健壮。

< P>我和XAMARIN的一个家伙进行了短邮件交换,他写了

我们尝试在本机类型和托管类型之间进行1对1映射,但是 这是不可能100%实现的,因为我们不知道所有的细节 iOS具有类型(因为在许多情况下iOS使用私有类型)。在某些方面 案例Objective-C类型甚至在运行时生成

不幸的是,Xamarin.iOS无法在运行时生成托管类型, 这意味着托管包装器类型仅限于在 编译时(它们也必须作为公共API记录)

这意味着您可以得到一个托管包装器对象 类型与本机Objective-C对象的类型不完全匹配 (您将只获得最接近的公共类型),这是您的情况

但是,在运行时,您可以看到本机对象的实际类型 (在您的特定案例中,您看到的是本机的输出 “描述”选择器(相当于托管ToString方法), 由本机对象本身提供,因此返回 精确运行时类型的字符串表示形式)

如果要将对象筛选为其基础目标为-C的对象 类型正是UIView,您可以尝试以下操作:


现在还不清楚你想要实现什么。查找不完全是UIView的UITextView子视图?在这种情况下,它可以正常工作,因为UITextSelectionView不是UIView。当您使用GetType方法和typeof运算符比较类型时,只有当这两种类型完全相同且相等不考虑继承层次结构时,相等才会计算为true。@kyurkchyan我有一个UIView结构,其中也有UIView等。其中一些UIView包含其他元素,如UITextView。当我从顶部UIView开始迭代时,我只想得到返回的所有UIView,但它也给了我UIExtSelectionView,它在任何情况下都不是UIView,我的问题是-为什么?我上面的例子只是一个如何重现这个案例的例子,我使用UIView——并且只有那个对象——作为其他元素的容器。我想遍历这些对象,并且只遍历这些对象(没有子类,什么都没有)来做某些事情。现在的问题是,我在结果列表中获得了UITextSelectionView,尽管它不是UIView。
if (!(element is UIView))
if (element.Class.Handle != ObjCRuntime.Class.GetHandle (typeof (UIView))