我在示例中看到了这段代码:
if (obj is User) { // do something }
我想在switch / case流中检查对象的类型,并找到对象的属性.runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
这是检查对象类型的正确方法吗?
答案 0 :(得分:7)
Dart switch语句中不支持按类型切换。
您应该使用一系列if
测试代替:
if (obj is User) {
print(obj);
} else if (obj is ...) ...
我真的,真的建议你永远不要使用runtimeType
。
它可用于使用dart:mirrors
反映对象的类型(但您也可以使用reflect(object)
来反映对象本身)。除此之外,使用runtimeType
几乎总会导致其他可避免的问题。
Type
返回的runtimeType
对象唯一能做的就是检查它是否相等。如果你这样做(比如上面的开关),那么你就不能正确处理子类型。如果您的系统中有User
的子类型,例如User
是一个接口而实现类是不同的,或者您是否模拟User
进行测试,或者任何数量的其他原因,然后实例不会User
为runtimeType
,代码不会识别它。
或许它会,因为runtimeType
可以被用户覆盖,任何类都可以选择返回User
。针对runtimeType
进行测试并不能保证该课程实际上是您所检查的课程。
比较类型时,应始终使用is
,因为它正确处理子类。
子类型可替代性是面向对象编程的核心思想之一,因此您可以说如果使用runtimeType
,则可能没有进行最优的OO设计。
(有些情况下,代码在other.runtimeType == MyClass
中使用operator==
来避免等同于子类实例以避免" ColorPoint"问题 - 但这意味着它'不可能创建该类型的子类或接口实现(包括模拟)并让它通过相等检查。这是一个非常微妙的限制,我将避免在共享库代码中。你在自己的应用程序中做了什么,没有人会依赖,至少只是你的问题:微笑:)。
答案 1 :(得分:0)
切换字符串有效。
switchType(Object object) {
switch (MirrorSystem.getName(new Symbol(object.runtimeType.toString()))) {
case "Animal":
print('animal basic');
break;
case 'Cat':
print('Mouse for cat');
break;
}
}
答案 2 :(得分:0)
您可以预先创建条件。这也是我碰到的一个例子:
String grade;
if(grade is String) {
grade = grade;
} else {
grade = null.toString();
}
switch(grade) {
case "A":
print("Good");
break;
case "B":
print("Nice");
break;
case "null":
print("Type a string");
break;
default:
print("failed");
break;
}
这样,您可以检查值是否存在或为空字符串。如上所述,最简单的部分是使用简单的If-Else,否则使用它。