如何检查交换机/机箱中对象的类型?

时间:2017-03-15 06:21:02

标签: dart

我在示例中看到了这段代码:

if (obj is User) { // do something }

我想在switch / case流中检查对象的类型,并找到对象的属性.runtimeType

switch (obj.runtimeType) {
    case User:
        print(obj);
        break;
}

这是检查对象类型的正确方法吗?

3 个答案:

答案 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进行测试,或者任何数量的其他原因,然后实例不会UserruntimeType,代码不会识别它。 或许它会,因为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,否则使用它。