使用dart检索getter值:镜像反射

使用dart检索getter值:镜像反射,dart,dart-mirrors,Dart,Dart Mirrors,我有以下代码(简化),它使用反射来迭代类的字段和getter并输出值。ContainsGetter类包含一个getter,而ContainsField类包含一个简单字段 使用dart:mirrors库,我可以通过使用instanceMirror.getField(fieldName)获取字段值,但不能通过使用instanceMirror.invoke(fieldName,[])获取getter 以下Dart脚本(使用构建17463)给出以下输出: 应用程序脚本 Field: aField=I a

我有以下代码(简化),它使用反射来迭代类的字段和getter并输出值。
ContainsGetter
类包含一个getter,而
ContainsField
类包含一个简单字段

使用
dart:mirrors
库,我可以通过使用
instanceMirror.getField(fieldName)
获取字段值,但不能通过使用
instanceMirror.invoke(fieldName,[])
获取getter

以下Dart脚本(使用构建17463)给出以下输出:

应用程序脚本

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)
导入“dart:mirrors”;
类ContainsGetter{//引发错误
String get aGetter=>“我是一名获得者”;
}
类包含字段{//工作正常
String aField=“我是一个字段”;
}
void main(){
printfield值(reflect(newcontainsfield());
printGetterValue(reflect(新ContainsGetter());
}
无效打印字段值(instanceMirror){
var classMirror=instanceMirror.type;
classMirror.variables.keys.forEach((键){
var futureField=instanceMirror.getField(key);//打印(“Field:$key=${imField.reflectee}”);
});
}
无效PrintGetterValue(instanceMirror){
var classMirror=instanceMirror.type;
classMirror.getters.keys.forEach((key){
var futureValue=instanceMirror.invoke(键,[]);//打印(“字段:$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)
Field:aField=我是一个字段
未捕获错误:镜像执行期间的编译时错误:
堆栈跟踪:
#0\u LocalObjectMirrorImpl.\u调用(dart:mirrors修补程序:163:3)
#1_LocalObjectMirrorImpl.invoke(dart:mirrors修补程序:125:33)

(一个可以接受的说法是“这一点还没有写出来!”)

啊,我刚刚算出来。尽管
aGetter
在其实现中类似于一个方法,但您可以使用
getField()
而不是
invoke
来检索其值

void printGetterValue(instanceMirror){
var classMirror=instanceMirror.type;
classMirror.getters.keys.forEach((key){
var futureValue=instanceMirror.getField(key);//打印(“Field:$key=${imValue.reflectee}”);
});
}

实际上,更像是字段定义总是生成getter和setter,至少在语言语义级别(不确定实现),因此getField/setField总是调用getter/setter:-)@Ladicek-谢谢。我的感觉是mirror
getField()
函数有误导性——当然我应该总是能够
invoke(getter)
invoke(field)
并返回一个值(或
invoke(field,[value])
并调用setter)。为什么
getField
invoke
之间有区别,如果它在幕后有效地做同样的事情呢?不知道。但它有点反映了语法——调用方法和访问字段(=调用getter/setter)看起来也不同。