gpt4 book ai didi

dart - 使用dart检索 setter/getter 值:镜面反射

转载 作者:行者123 更新时间:2023-12-03 03:29:34 37 4
gpt4 key购买 nike

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

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

以下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)

(可以接受的是“还没写完!”)

最佳答案

啊,我已经解决了。尽管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}"));
});
}

关于dart - 使用dart检索 setter/getter 值:镜面反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14504896/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com