14

就像在 PHP 中动态类方法调用中的问题一样,我想在 Dart 中执行此操作。

var = "name";
page.${var} = value;
page.save();

那可能吗?

4

3 回答 3

16

使用Mirrors可以实现几件事。

这是一个如何设置类的值以及如何动态调用方法的示例:

import 'dart:mirrors';

class Page {
  var name;

  method() {
    print('called!');
  }
}

void main() {
  var page = new Page();

  var im = reflect(page);

  // Set values.
  im.setField("name", "some value").then((temp) => print(page.name));

  // Call methods.
  im.invoke("method", []);
}

如果您想知道,im是一个InstanceMirror,它基本上反映了page实例。

还有一个问题:有没有办法在 Dart 的类中动态调用方法或设置实例变量?

于 2012-11-08T17:40:50.477 回答
7

你可以使用Dart Mirror API来做这样的事情。Mirror API 现在还没有完全实现,但它是如何工作的:

import 'dart:mirrors';

class Page {
  String name;
}

main() {
  final page = new Page();
  var value = "value";

  InstanceMirror im = reflect(page);
  im.setField("name", value).then((_){
    print(page.name); // display "value"
  });
}
于 2012-11-08T17:23:23.323 回答
3

您可以使用可序列化

例如:

import 'package:serializable/serializable.dart';

@serializable
class Page extends _$PageSerializable {
  String name;
}

main() {
  final page = new Page();
  var attribute = "name";
  var value = "value";

  page["name"] = value;
  page[attribute] = value;

  print("page.name: ${page['name']}");
}
于 2018-02-06T18:03:49.207 回答