从dartlang中的字符串创建类实例

时间:2019-03-14 18:21:54

标签: dart

我创建了此类

class Opacity {
  String a,b,c;

  Opacity({this.a, this.b,this.c});
}

我试图仅使用字符串和参数的哈希图来动态创建此类的实例。

String type = "Opacity";
List<String> args = {'a': 'a', 'b': 'b','c': 'c'}

我有一个约束,我不能修改Opacity类。

在创建实例时,我曾考虑过使用反射从字符串动态创建类,但是我不知道如何动态传递参数。

2 个答案:

答案 0 :(得分:1)

从字符串到源名称,再到由该源名称表示的内容,都是反射。仅通过dart:mirrors库,或者如果您提前生成代码(可能使用package:reflectable),就可以使用它。

在这一点上,Dart与JavaScript等语言有所不同,在JavaScript中,您可以在运行时检查所有值。

没有反思,调用构造函数的唯一方法是在代码中是否有实际的代码执行该调用。这意味着您必须至少在代码中的某个位置拥有类似Opacity(a: ..., b: ..., c: ...)的代码。 您可以定义以下函数:

Opacity createOpacity(Map<String, String> args) => 
    Opacity(a: args["a"], b: args["b"], c: args["c"]);

那么您可以按名称注册为:

Map<String, Function> factories = {"Opacity": createOpacity};

最后将其用作:

var type = "Opacity";
var args = {'a': 'a', 'b': 'b', 'c': 'c'};
Opacity myOpacity = factories[type](args);

答案 1 :(得分:1)

要动态地将参数传递给构造函数,可以使用newInstance的{​​{1}}方法。

例如

ClassMirror