我有以下代码(简化),它使用反射来迭代类的字段和getter并输出值。 ContainsGetter
类包含一个getter,ContainsField
类包含一个简单字段。
使用dart:mirrors
库,我可以使用instanceMirror.getField(fieldName)
获取字段的值,但不能使用instanceMirror.invoke(fieldName,[])
获取获取者。
以下Dart脚本(使用构建17463)给出了以下输出:
应用脚本
import 'dart:mirrors';
class ContainsGetter { // raises an error
String get aGetter => "I am a getter";
}
class ContainsField { // works fine
String aField = "I am a field";
}
void main() {
printFieldValues(reflect(new ContainsField()));
printGetterValues(reflect(new ContainsGetter()));
}
void printFieldValues(instanceMirror) {
var classMirror = instanceMirror.type;
classMirror.variables.keys.forEach((key) {
var futureField = instanceMirror.getField(key); // <-- works ok
futureField.then((imField) => print("Field: $key=${imField.reflectee}"));
});
}
void printGetterValues(instanceMirror) {
var classMirror = instanceMirror.type;
classMirror.getters.keys.forEach((key) {
var futureValue = instanceMirror.invoke(key,[]); // <-- fails
futureValue.then((imValue) => print("Field: $key=${imValue.reflectee}"));
});
}
输出
Field: aField=I am a field
Uncaught Error: Compile-time error during mirrored execution: <Dart_Invoke: did not find instance method 'ContainsGetter.aGetter'.>
Stack Trace:
#0 _LocalObjectMirrorImpl._invoke (dart:mirrors-patch:163:3)
#1 _LocalObjectMirrorImpl.invoke (dart:mirrors-patch:125:33)
(可以接受的是“这一点还没有写好!”)
答案 0 :(得分:2)
啊,我刚刚解决了。虽然aGetter
就像其实施中的方法一样,但您使用getField()
而不是invoke
来检索其值。
void printGetterValues(instanceMirror) {
var classMirror = instanceMirror.type;
classMirror.getters.keys.forEach((key) {
var futureValue = instanceMirror.getField(key); // <-- now works ok
futureValue.then((imValue) => print("Field: $key=${imValue.reflectee}"));
});
}