3

假设我有一个 class 的实例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,但方法不被视为字段,因此不起作用。有任何想法吗?

4

2 回答 2

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 实现为方法,实际上就可以了。它在这里对您不起作用,但原因与您想象的不同。

于 2013-07-01T02:43:48.510 回答
1

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

于 2013-07-01T16:57:22.983 回答