首页 > 解决方案 > 为什么这个基本的 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;
  }
}

标签: dartdart-mirrors

解决方案


请尝试以下代码:

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;
  }
}

推荐阅读