在Dart中打开类类型

Mic*_*ick 12 dart

我正在寻找在Dart超类中编写一个函数,该函数根据实际使用它的子类采取不同的操作.像这样的东西:

class Foo {
  Foo getAnother(Foo foo) {
    var fooType = //some code here to extract fooType from foo;
    switch (fooType) {
      case //something about bar here:
        return new Bar();
      case //something about baz here:
        return new Baz();
    }
  }
}

class Bar extends Foo {}

class Baz extends Foo {}
Run Code Online (Sandbox Code Playgroud)

其中的想法是我有一些对象,并希望获得同一(子)类的新对象.

主要问题是应该是什么类型fooType?我的第一个想法是Symbol,这导致了简单的案例陈述case #Bar:,但我不知道如何填充fooType符号.我能想到的唯一选择是做类似的事情,Symbol fooType = new Symbol(foo.runtimeType.toString());但我的理解是runtimeType.toString()转换为javascript后无效.您可以通过使用Mirrors来解决这个问题,但这应该是一个轻量级的库,所以这些不在桌面上.Object.runtimeType返回Type类的东西,但我不知道如何创建Type我可以用于case语句的实例.也许我错过了一些更适合这个的Dart库?

Ale*_*uin 22

你可以使用runtimeTypein switch:

class Foo {
  Foo getAnother(Foo foo) {
    switch (foo.runtimeType) {
      case Bar:
        return new Bar();
      case Baz:
        return new Baz();
    }
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

case语句中,类名直接使用(aka .class literal).这给出了一个与提到的类对应的Type对象.因此foo.runtimeType可以与指定的类型进行比较.

请注意,您现在不能类文字中使用泛型.因此case List<int>:是不允许的.

  • 这不适用于`List`和`Map`,`Set`以及其他可能. (2认同)

Dmi*_*nin 12

使用 flutter 3.0,您可以执行以下操作:

  1. 定义类:
abstract class LoginActionsEvent {}
 
class LoginActionsCheckConnectionEvent implements LoginActionsEvent {
   const LoginActionsCheckConnectionEvent();
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用开关类型:
switch (event) {
  case final LoginActionsCheckConnectionEvent e:
    return _onLoginActionsCheckConnection(e, emit);
  default:
    throw UnimplementedError('Unknown event: $event');
}
Run Code Online (Sandbox Code Playgroud)

  • 这太方便了,谢谢你指出这一点。 (2认同)