我在代码示例中看到:
if (obj is User) { // do something }
我想判断Switch/Case流中的对象类型,并找到该对象的属性.runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
这是判断对象类型的正确方法吗?
我在代码示例中看到:
if (obj is User) { // do something }
我想判断Switch/Case流中的对象类型,并找到该对象的属性.runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
这是判断对象类型的正确方法吗?
Dart switch语句中不支持按类型切换.
if (obj is User) {
print(obj);
} else if (obj is ...) ...
我真的,真的建议你任何事情都不要用runtimeType
.
它可以用于在对象类型上使用dart:mirrors
进行反射(但也可以只使用reflect(object)
在对象本身上进行反射).除此之外,使用runtimeType
几乎总是会导致原本可以避免的问题.
对于runtimeType
返回的Type
对象,您唯一能做的就是判断它是否相等.如果您这样做(就像上面的switch 一样),那么您就没有正确地处理子类型.如果您的系统中曾经有User
的子类型,例如,如果User
是一个接口并且实现类不同,或者如果您为了测试而模拟User
,或者任何数量的其他原因,那么实例将不会将User
作为runtimeType
,并且代码将无法识别它.
或许它会,因为runtimeType
可以被用户重写,并且任何类都可以 Select 返回User
.针对runtimeType
进行测试并不能保证该类就是您要判断的类.
在比较类型时,应该始终使用is
,因为它可以正确处理子类.
子类型可替换性是面向对象编程的核心思想之一,因此您可以说,如果您使用runtimeType
,您可能没有进行最佳的OO设计.
(有些情况下,代码在operator==
中使用other.runtimeType == MyClass
来避免与子类实例相等,从而避免"色点"问题——但这意味着不可能使该类型的子类或接口实现(包括模拟)通过相等性判断.这是我在共享库代码中避免的一个非常微妙的限制.你在自己的应用程序中所做的,没有其他人会依赖的,至少只是你的问题:微笑:).