如何检查交换机/机箱中对象的类型?

Ser*_*rov 3 dart

我在示例中看到了这段代码:

if (obj is User) { // do something }
Run Code Online (Sandbox Code Playgroud)

我想检查一个开关/案例流中的对象类型,并找到.runtimeType该对象的属性:

switch (obj.runtimeType) {
    case User:
        print(obj);
        break;
}
Run Code Online (Sandbox Code Playgroud)

这是检查对象类型的正确方法吗?

lrn*_*lrn 8

Dart switch语句中不支持按类型切换.您应该使用一系列if测试:

if (obj is User) { 
  print(obj);
} else if (obj is ...) ...
Run Code Online (Sandbox Code Playgroud)

我真的,真的建议你永远不要用runtimeType任何东西.

它可以用于反映,使用dart:mirrors,对象的类型(但您也可以reflect(object)用来反映对象本身).除此之外,使用runtimeType几乎总是会导致其他可避免的问题.

您可以对Type返回的对象执行的唯一操作runtimeType是检查它是否相等.如果你这样做(如上面的开关),那么你没有正确处理子类型.如果你的系统中有一个子类型User,比如if User是一个接口而且实现类是不同的,或者你是User为了测试或者其他任何原因而模拟一个,那么实例将没有Useras runtimeType,并且代码赢了不承认.或许它会,因为runtimeType可以被用户覆盖,任何类都可以选择返回User.测试runtimeType不能保证课程实际上是您检查的课程.

比较类型时,应始终使用is它,因为它正确处理子类.子类型可替代性是面向对象编程的核心思想之一,所以你可以说,如果你使用runtimeType,你可能没有做一个最优的OO设计.

(存在这样的情况,其中的代码使用other.runtimeType == MyClassoperator==避免被等于一个子类实例避免"重点色"问题-但它意味着它不可能使一个子类或接口实现(其包括该类型的嘲笑),并把它传递平等这是一个非常微妙的限制,我会在共享库代码中避免.你在自己的应用程序中做的事情,没有其他人会依赖,至少只是你的问题:微笑:).