dart - 为什么这个基本的 Dart 镜像用法不起作用
问题描述
我在控制台应用程序中有以下代码:
import 'dart:mirrors';
void main() {
final foo = Foo();
final mirror = reflect(foo);
final instanceMirror = mirror.invoke(#test, []);
print(instanceMirror);
}
class Foo {
int get test {return 42;}
}
当我运行它时,我得到一个异常:
Exception has occurred.
NoSuchMethodError (NoSuchMethodError: Class 'int' has no instance method 'call'.
Receiver: 42
Tried calling: call())
如果我设置了一个断点,test
那么它会在异常之前被命中,所以它肯定是在调用该属性。
为什么会抛出异常?
更新:最终我想要实现的是获取对象中所有属性的值。根据@mezoni 的回答,似乎我需要将属性视为字段而不是方法(顺便说一句,与 C# 相反)。但是,仍然不完全清楚为什么或如何枚举所有字段。我得到的最好的是:
import 'dart:mirrors';
void main() {
final foo = Foo();
final mirror = reflect(foo);
for (var k in mirror.type.instanceMembers.keys) {
final i = mirror.type.instanceMembers[k];
if (i.isGetter && i.simpleName != #hashCode && i.simpleName != #runtimeType) {
final instanceMirror = mirror.getField(i.simpleName);
print("${MirrorSystem.getName(i.simpleName)}: ${instanceMirror.reflectee}");
}
}
}
class Foo {
int get someOther {
return 42;
}
int get test {
return someOther + 13;
}
}
解决方案
请尝试以下代码:
import 'dart:mirrors';
void main() {
final foo = Foo();
final mirror = reflect(foo);
final instanceMirror = mirror.getField(#test);
print(instanceMirror.reflectee);
}
class Foo {
int get test {
return 42;
}
}
推荐阅读
- rust - 如何编写一个宏来返回基于字符串的结构的实现方法?
- r - 另一个向量中特定对象的向量中的第二大值
- mysql - 如何根据第 1 列的值仅获取第 2 列的唯一值?
- php - 使用 laravel api 在 swoole 上启用 https
- python - new_row = dict.fromkeys(df, 0) 语句的问题
- javascript - 使用 react-pdf 和 pdfjs 从 PDF blob 创建图像列表
- python - CV2 和 Pillow 给出不同的图像形状
- python - 如何使用 Python 在 H2o 库中重用带有 GBM 的 cross_validation_fold_assignment()
- apache-spark - 如何过滤 PySpark 中数组列中的值?
- flutter - 如何使用 Provider 将 mock 注入到 Flutter 测试中