在 dart 中定义 class 之后在库级别执行代码
execute code at library level after class definition in dart
所以我正在尝试将一个小的实用程序代码从 JS 迁移到 Dart,但我正在努力寻找如何执行以下操作:
注册表用于将 Class 映射到返回 DifferentClass 新实例的函数。
typedef DifferentClass InstanceGenerator();
Map<Type, InstanceGenerator> _registry;
_registry[ClassDefinition] = () => new DifferentClass();
// at runtime
var a = new ClassDefinition();
var b = _registry[a.runtimeType](); // should resolve to instance of DifferentClass.
这一切都工作得很好,但我目前面临的问题是我需要能够添加到任何 class 范围之外的注册表,并且基本上是在 class 的级别图书馆。在 JS 中,这是作为顶级调用实现的,但在 Dart 中,这似乎是不允许的(DartEditor 说不)。
我如何在 Dart 中执行此模式:基本上我需要为每个 class 注册一个解析为另一个 class 的实例的函数,并在运行时基于实例的运行时类型第一个 class 创建为其注册的那个。
目前看起来是这样的:
library whatever;
class ABC {}
Registry.instance.register(ABC, () => new DEF()); // This does not work.
您不能将要在库顶层执行的代码。
您只能在库顶层创建函数、类、枚举和 typedef。
在 Dart 中,所有内容都需要从 main()
或从 main()
调用的任何内容显式调用
你可以创建一个像
这样的函数
library whatever;
class ABC {}
register() => Registry.instance.register(ABC, () => new DEF());
然后例如从主
import 'whatever.dart' as we;
main() {
we.register();
}
或者,您可以使用 initialize 包以声明方式执行此操作。
所以我正在尝试将一个小的实用程序代码从 JS 迁移到 Dart,但我正在努力寻找如何执行以下操作:
注册表用于将 Class 映射到返回 DifferentClass 新实例的函数。
typedef DifferentClass InstanceGenerator();
Map<Type, InstanceGenerator> _registry;
_registry[ClassDefinition] = () => new DifferentClass();
// at runtime
var a = new ClassDefinition();
var b = _registry[a.runtimeType](); // should resolve to instance of DifferentClass.
这一切都工作得很好,但我目前面临的问题是我需要能够添加到任何 class 范围之外的注册表,并且基本上是在 class 的级别图书馆。在 JS 中,这是作为顶级调用实现的,但在 Dart 中,这似乎是不允许的(DartEditor 说不)。
我如何在 Dart 中执行此模式:基本上我需要为每个 class 注册一个解析为另一个 class 的实例的函数,并在运行时基于实例的运行时类型第一个 class 创建为其注册的那个。
目前看起来是这样的:
library whatever;
class ABC {}
Registry.instance.register(ABC, () => new DEF()); // This does not work.
您不能将要在库顶层执行的代码。
您只能在库顶层创建函数、类、枚举和 typedef。
在 Dart 中,所有内容都需要从 main()
或从 main()
你可以创建一个像
这样的函数library whatever;
class ABC {}
register() => Registry.instance.register(ABC, () => new DEF());
然后例如从主
import 'whatever.dart' as we;
main() {
we.register();
}
或者,您可以使用 initialize 包以声明方式执行此操作。