Dart 如何检查开关/机箱中对象的类型?
我在代码示例中看到:Dart 如何检查开关/机箱中对象的类型?,dart,Dart,我在代码示例中看到: if (obj is User) { // do something } 我想检查开关/案例流中对象的类型,并找到该对象的属性。runtimeType: switch (obj.runtimeType) { case User: print(obj); break; } 这是检查对象类型的正确方法吗? Dart switch语句中不支持按类型切换。 您应该使用一系列if测试: 如果(obj是用户){ 打印(obj); }否则,如果
if (obj is User) { // do something }
我想检查开关/案例流中对象的类型,并找到该对象的属性。runtimeType
:
switch (obj.runtimeType) {
case User:
print(obj);
break;
}
这是检查对象类型的正确方法吗?
Dart switch语句中不支持按类型切换。
您应该使用一系列if
测试:
如果(obj是用户){
打印(obj);
}否则,如果(obj是…)。。。
我真的,真的建议你不要在任何事情上使用runtimeType
它可以使用dart:mirrors
在对象类型上进行反射(但也可以使用reflect(object)
在对象本身上进行反射)。除此之外,使用runtimeType
几乎总是会导致本来可以避免的问题
对于runtimeType
返回的Type
对象,唯一可以做的就是检查它是否相等。如果这样做(如上面的开关),则无法正确处理子类型。如果您的系统中有一个子类型User
,比如User
是一个接口,并且实现类不同,或者如果您模拟User
进行测试,或者其他任何原因,那么实例将不会将User
作为runtimeType
,代码也不会识别它。
或者可能会,因为用户可以覆盖runtimeType
,任何类都可以选择返回user
。针对runtimeType
进行测试并不能保证该类实际上就是您要检查的类
在比较类型时,应该始终使用is
,因为它正确地处理子类。
子类型可替换性是面向对象编程的核心思想之一,因此您可以说,如果您使用runtimeType
,您可能没有进行最佳的OO设计
(有些情况下,代码在操作符==
中使用other.runtimeType==MyClass
,以避免与子类实例相等,从而避免“ColorPoint”问题,但这意味着不可能实现子类或接口(包括mock)这是我在共享库代码中要避免的一个非常微妙的限制。你在自己的应用程序中所做的,没有其他人会依赖的,至少只是你的问题:微笑:)。切换字符串有效
switchType(对象){
开关(MirrorSystem.getName(新符号(object.runtimeType.toString())){
“动物”一案:
印刷品(‘动物基础’);
打破
“猫”一案:
打印(“鼠标代表猫”);
打破
}
}
您可以事先创建条件。下面是一个例子,我也碰到了这个:
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,但也可以使用它。有一个非常肮脏的hack,我只是为了完整性,而不是因为你应该这样做:
尝试{throw obj;}on User{print(obj);}on SomethingElse{useAsSomethingElse(obj);}on Object{/*默认值,需要避免未捕获。*/}
这似乎可以在2020年完成。链接问题中的方法附带了大量警告。例如,它不适用于列表
。如果可以避免的话,我仍然不依赖运行时类型
。使用is
测试对象类型,这就是它的目的。