有没有办法将字符串映射到Dart中的类型?

时间:2019-01-01 13:16:17

标签: dictionary types 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语句和代码重复,因为BCD具有相同的构造界面,并且不止3个类。

编辑:请注意,在我的情况下,该类的字符串标识符仅在运行时才知道,我将收到字符串流,并基于此创建一个{ {1}},其中元素是List<A>的专门后代。

1 个答案:

答案 0 :(得分:0)

Dart Type对象是代表类型的不透明标记。它们不是类型本身。 您不能在需要类的地方使用Type对象,因此不能执行new TypeVar()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);

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