【问题标题】:Dynamic class method invocation in DartDart 中的动态类方法调用
【发布时间】:2012-10-28 21:41:07
【问题描述】:

就像Dynamic class method invocation in PHP 的问题一样,我想在 Dart 中执行此操作。

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

这可能吗?

【问题讨论】:

  • 请务必在其中一个答案上打上绿色复选标记!他们都是正确的。

标签: dart dart-mirrors


【解决方案1】:

您可以使用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?

【讨论】:

  • 有人知道如何在 Flutter 中做到这一点吗?在颤振中,我们无法导入 dart:mirros 包:/
【解决方案2】:

你可以使用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() 才能让它正常工作。当然,它现在很幸运,因为操作碰巧是非异步的 :)
  • 感谢您的评论。我是 Future 用法的新手,我对 await 提案感到困惑 www.dartbug.com/104
【解决方案3】:

您可以使用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']}");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多