镜子返回期货会极大地限制你可以用它们做什么。
例如,
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的值(使用值getter),但是getter不再可用。
我的问题:
有没有办法同步获得反射调用的结果?
在分布式设置中,期货肯定是要走的路。但是在非分布式设置中,所有元信息都可用,应该可以获得反射调用的值。我会为测试框架和构建工具的作者带来巨大的变化。
答案 0 :(得分: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加注星标。
答案 1 :(得分:1)
目前您可以使用deprecatedFutureValue(aFuture)。显而易见,他们不鼓励使用它,它最终会消失,但我同意,在我们获得同步镜像API之前,你绝对需要这样的东西。