繁体   English   中英

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

[英]Is there a way to map strings to types in 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个类。

编辑:需要明确的是,在我的情况下,仅在运行时才知道该类的字符串标识符,我将收到字符串流,并基于此我要创建List<A> ,其中元素是专用的A后代。

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM