有没有办法动态调用方法或在Dart中的类中设置实例变量?

时间:2012-05-10 00:18:25

标签: dart dart-mirrors dynamic-method

我希望能够使用Dart类构造函数执行类似的操作:

class Model {

  // ... setting instance variables

  Model(Map fields) {
    fields.forEach((k,v) => this[k] = v);
  }

}

显然,这不起作用,因为this没有[]=方法。

有没有办法让它发挥作用,或者它根本不是“做事的蠢道”?如果不是,你能告诉我解决这个问题的正确方法吗?

2 个答案:

答案 0 :(得分:7)

您可以使用Mirrors

InstanceMirror im = reflect(theClassInstance);

im.invoke('methodName', ['param 1', 2, 'foo']).then((InstanceMirror value) {
  print(value.reflectee); // This is the return value of the method invocation.
});

所以,在你的情况下,你可以这样做(因为你有设置者):

import 'dart:mirrors';

class Model {
  Model(Map fields) {
    InstanceMirror im = reflect(this);
    fields.forEach((k, v) => im.setField(k, v)); // or just fields.forEach(im.setField);
  }
}

InstanceMirror的文档可能会派上用场。

答案 1 :(得分:1)

目前没有。在这样的事情(希望)成为可能之前,你将不得不等待反射到达达特。在那之前,你最好的选择可能是在构造函数中完成它。或者,您可以尝试使用类似JsonObject的内容,它允许您直接从地图初始化它(有关其工作原理的说明,请查看this博文)。