Is there a way to dynamically call a method or set

2019-06-26 03:39发布

I would want to be able to do something like this with a Dart class constructor:

class Model {

  // ... setting instance variables

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

}

Obviously, this doesn't work, because this doesn't have a []= method.

Is there a way to make it work or is it simply not "the dart way" of doing things? If it's not, could you show me what would be the right way to tackle this?

2条回答
Lonely孤独者°
2楼-- · 2019-06-26 04:01

Currently no. You will have to wait for reflection to arrive in Dart before something like this (hopefully) becomes possible. Until then your best bet is probably to do it in a constructor. Alternatively you could try to use something like JsonObject which allows you to directly initialize it from a Map (for an explanation on how this works, check this blog post).

查看更多
Summer. ? 凉城
3楼-- · 2019-06-26 04:18

You can use 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.
});

So, in your case you could do this (since you have setters):

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

The documentation for InstanceMirror might come in handy.

查看更多
登录 后发表回答