Почему это основное использование зеркала Dart не работает - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть следующий код в консольном приложении:

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

1 Ответ

1 голос
/ 16 апреля 2019

Пожалуйста, попробуйте этот код:

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...