dictionary - 有没有办法将字符串映射到 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
,具有相同的构造接口C
,D
并且不仅仅是 3 个类。
编辑:为了清楚起见,在我的情况下,类的字符串标识符只会在运行时知道,我将收到一个字符串流,并基于此创建一个List<A>
,其中元素是A
.
解决方案
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);
只要所有构造函数都接受相同的参数。
推荐阅读
- javascript - 有没有办法只在选中复选框的情况下传递复选框值?
- c# - 第一次在 C# 上使用 lambda 函数
- angularjs - 有没有办法将图表或带有仪表板的图表放在 AngularJS 项目中?
- java - 调用 startActivity() 时获得相同的屏幕
- excel - 是否可以读取 Excel 表并纯粹在前端显示其内容?
- jmeter - 如何从仪表板报告中保存图表(JMeter)
- c# - VSTO,更改word文档中所有图片的大小以适应页面宽度
- android - Fleetboard 上的 TLS 1.2
- pine-script - 我正在尝试使用“更改”功能添加条件
- c++ - 如何将两组与自定义数据类型进行比较