Kent Boogaart
Kent Boogaart

Reputation: 178680

Why is this basic Dart mirror usage not working

I've got the following code in a console application:

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

When I run it I get an exception:

Exception has occurred.
NoSuchMethodError (NoSuchMethodError: Class 'int' has no instance method 'call'.
Receiver: 42
Tried calling: call())

If I set a breakpoint on test then it is hit before the exception, so it's definitely invoking the property.

Why is an exception being thrown?

UPDATE: ultimately what I am trying to achieve is to grab the values of all properties in an object. Per @mezoni's answer, it seems I need to treat properties as fields rather than methods (the opposite of C#, incidentally). However, it's still not entirely clear why or how to enumerate all fields. The best I've gotten is this:

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

Upvotes: 2

Views: 164

Answers (1)

mezoni
mezoni

Reputation: 11210

Please try this code:

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

Upvotes: 1

Related Questions