У меня есть следующий код в консольном приложении:
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;
}
}