使用镜像,我如何获得对类方法的引用?

时间:2013-06-30 23:32:31

标签: dart dart-mirrors

假设我有一个类Foo的实例,我想获取一个以某种方式注释的所有方法的列表。我希望有一个方法本身的引用,所以我不打算每次使用反射调用方法,只是为了第一次获取它的引用。

换句话说,我想做与此相当的反射:

class Foo {
  a() {print("a");}
}

void main() {
  var f = new Foo();
  var x = f.a; // Need reflective way of doing this
  x(); // prints "a"
}

我已尝试使用InstanceMirror#getField,但方法不被视为字段,因此无效。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

据我了解Dart中的反射,无法按照您的意愿获得实际方法。 (如果有人出现并展示如何做到这一点,我会非常高兴地删除这个答案。)

我能想出的最好的方法是改善你可能不喜欢使用反射来调用方法的一些内容:

import 'dart:mirrors';

class Foo {
  a() {print("a");}
}

void main() {
  var f = new Foo();

  final fMirror = reflect(f);
  final aSym = new Symbol('a');
  final x = () => fMirror.invoke(aSym, []);

  x(); // prints "a"
}

同样,我知道这不是你想要的,但我相信它尽可能接近你。

旁注:getField 调用 getter并返回结果 - 如果将getter实现为方法,它实际上很好。它在这里不适合你,但出于与你想象的不同的原因。

答案 1 :(得分:1)

您想要获得的内容将被描述为该方法的“封闭式”版本。也就是说,您希望将方法作为函数获取,其中接收器隐含在函数调用中。没有办法从镜子中获得这个。您可以将methodMirror作为    reflect(foo).type.methods [const Symbol(“a”)] 但是你不能调用结果。