【发布时间】:2012-10-28 21:41:07
【问题描述】:
就像Dynamic class method invocation in PHP 的问题一样,我想在 Dart 中执行此操作。
var = "name";
page.${var} = value;
page.save();
这可能吗?
【问题讨论】:
-
请务必在其中一个答案上打上绿色复选标记!他们都是正确的。
标签: dart dart-mirrors
就像Dynamic class method invocation in PHP 的问题一样,我想在 Dart 中执行此操作。
var = "name";
page.${var} = value;
page.save();
这可能吗?
【问题讨论】:
标签: dart dart-mirrors
您可以使用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 实例。
还有一个问题:Is there a way to dynamically call a method or set an instance variable in a class in Dart?
【讨论】:
你可以使用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"
});
}
【讨论】:
Futures.wait() 的调用在这里毫无意义。你可以省略它,结果是一样的。 Futures.wait() 返回一个 Future,它在给定的操作完成时完成,所以,你真的必须写一个 .then() 才能让它正常工作。当然,它现在很幸运,因为操作碰巧是非异步的 :)
await 提案感到困惑 www.dartbug.com/104
您可以使用Serializable
例如:
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']}");
}
【讨论】: