首页 文章

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

提问于
浏览
3

假设我有一个类 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 回答

  • 1

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

  • 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并返回结果 - 它's actually fine if the getter is implemented as a method. It doesn' t在这里工作,但原因与你想象的不同 .

相关问题