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
测试对象类型,这就是它的目的。