如果存在,则调用方法

use*_*952 3 dart dart-mirrors

是否有一个简单,轻量级/廉价的调用来确定对象是否支持命名方法?所以,在这个obj.respondsTo会很棒.

dynamic _toJson(dynamic obj) {
  return obj.respondsTo('toJson'))? obj.toJson() : obj;
}

class Foo {
  String foo = "Foo.foo";
  Bar bar = new Bar();
  Map toJson() {
    return {
      "foo" : _toJson(foo),
      "bar" : _toJson(bar)
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

一种替代方法是调用它并捕获noSuchMethod异常,但我认为这是不好的做法而且价格昂贵?

Sha*_*uli 6

最简洁的答案是不'.FrédéricHamidi提供的答案并不正确,但它在dart2js中不起作用(dart:镜子在dart2js中基本上没有实现).

此外,在检查对象是否响应特定方法时,在其他语言(例如Ruby)中非常常见,但对我来说它似乎并不特别Dart-y.也许一旦Dart完全支持镜像,这将会改变.

而且很难说基于镜子的反射是"轻量/便宜".这取决于用例以及如何定义这些术语.

我想说你最好的办法是调用对象上的方法,捕获NoSuchMethod异常,并实现一些默认的错误处理行为.如果您通常期望该方法存在,这尤其有意义.