首页 > 解决方案 > 有没有办法将字符串映射到 Dart 中的类型?

问题描述

我想保留一个字符串的常量映射到定义的类,这些类都继承自一个类 A:

class A {}
class B extends A {}
class C extends A {}
class D extends A {}

const strToType = {
  'str1': B,
  'str2': C,
  'str3': C,
  'str4': D,
  // etc.
};

因此,我假设这张地图采用 的形式Map<String, Type>,我什至尝试明确指出:<String, Type>{ /*...*/ }

不过,我不能使用这个映射来动态决定创建哪个对象,就像我在 Python 等其他一些语言中所做的那样:

A variable = new strToType[someString](args);

在这种情况下,Dart 检查器会显示一个错误,即strToType is not a class.

我试着strToType[someString]用括号括起来,然后它会抱怨这个new (部分。

实现我在 Dart 中所做工作的最佳方式是什么?我想避免大量的 switch 语句和代码重复,因为B,具有相同的构造接口CD并且不仅仅是 3 个类。

编辑:为了清楚起见,在我的情况下,类的字符串标识符只会在运行时知道,我将收到一个字符串流,并基于此创建一个List<A>,其中元素是A.

标签: dictionarytypesdart

解决方案


DartType对象是表示类型的不透明标记。它们不是类型本身。你不能Type在需要类的地方使用对象,所以你不能做new TypeVar()or TypeVar.staticMember

如果您想存储一种创建子类对象的方法,则需要存储一个执行此操作的函数。

const strToType = <String, A Function(argTypes)> {
 'str1': (args) => new A(args),
 'str2': (args) => new C(args),
 'str3': (args) => new C(args),
 'str4': (args) => new D(args),
 // etc.
};

然后你可以按照你的要求使用它:

A variable = strToType[someString](args);

只要所有构造函数都接受相同的参数。


推荐阅读