我在示例中看到了这段代码:
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)
这是检查对象类型的正确方法吗?
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 == MyClass在operator==避免被等于一个子类实例避免"重点色"问题-但它意味着它不可能使一个子类或接口实现(其包括该类型的嘲笑),并把它传递平等这是一个非常微妙的限制,我会在共享库代码中避免.你在自己的应用程序中做的事情,没有其他人会依赖,至少只是你的问题:微笑:).