2

让镜子返回期货极大地限制了你可以用它们做的事情。

例如,

class ObjectA {
  methodA(){}
  methodB(){}
}

class DynamicWrapper extends MagicalDynamicWrapper {
  ObjectA real;
  Map<String, Function> methods;
  DynamicWrapper(this.real, this.methods);
}

var w = new DynamicWrapper(new ObjectA(), {"methodB" : (){ 'do something' }});
w.methodA() // calls ObjectA.methodA
w.methodB() // calls 'do something'

我通常这样做的方式是在 MagicalDynamicWrapper 中定义 noSuchMethod:

  • 这将检查方法映射中是否存在具有这样名称的方法,然后调用它。
  • 如果没有,它将通过反射调用“真实”对象。

不幸的是,调用真实对象总是会返回一个未来。所以它不起作用。

在某些时候,可以获得 Future 的值(使用 value getter),但该 getter 不再可用。

我的问题:

有没有办法同步获得反射调用的结果?

在分布式环境中,futures 绝对是要走的路。但是在所有元信息都可用的非分布式设置中,应该可以获取反射调用的值。我会对测试框架和构建工具的作者产生巨大的影响。

4

2 回答 2

2

让镜子返回期货当然是有道理的

不,它没有(好吧,至少对我来说不是:-))。它可能会改变,见http://dartbug.com/4633#c17

我通常这样做的方式是在 MagicalDynamicWrapper 中定义 noSuchMethod ,它将检查方法映射中是否存在具有这样名称的方法,然后调用它,如果没有,它将通过调用“真实”对象反射。

检查InvocationMirror文档。您可以使用以下方法转发方法调用invokeOn

class Proxy {
  var target;
  Map<String, Function> overrides;

  Proxy(this.target, this.overrides);

  noSuchMethod(invocation) {
    if (overrides.containsKey(invocation.memberName)) {
      return overrides[invocation.memberName]();
    } else {
      return invocation.invokeOn(target);
    }
  }
}

有没有办法同步获得反射调用的结果?

不,不是。不是现在。如果您愿意,可以为http://dartbug.com/4633 加注星标。

于 2013-02-23T16:07:29.250 回答
1

暂时你可以使用 deprecatedFutureValue(aFuture)。显然,他们不鼓励使用它,它最终会消失,但我同意,在我们获得同步镜像 API 之前,你绝对需要这样的东西。

于 2013-02-24T20:20:15.580 回答