1

我正在尝试在 Dart 中构建一个使用反射的实体管理器。这个想法是方法getById(String id, String returnClass)调用方法_get[returnClass]ById(String id)

为此,我正在使用 dart:mirrors 并尝试确定我的实体管理器对象是否有这样的方法,然后调用它。不幸的是,LibraryMirror 不包含任何功能。

class EntityMgr {

  Object getById(String id, String returnClass) {
    InstanceMirror result = null;
    String methodName = '_get'+returnClass+'ById';

    // Check if a method '_get[returnClass]Byid exists and call it with given ID
    if(_existsFunction(methodName)) {
      Symbol symbol = new Symbol(methodName);
      List methodParameters = new List();
           methodParameters.add(id);

      result = currentMirrorSystem().isolate.rootLibrary.invoke(symbol, methodParameters);
    }

    return result;
  }

  Product _getProductById(String id) {
    return new Product();
  }

  bool _existsFunction(String functionName) {
    return currentMirrorSystem().isolate.rootLibrary.functions.containsKey(functionName);
  } 
}
4

1 回答 1

1

自此响应以来,镜像库已发生重大变化,不再反映此答案中提到的 api

隔离用于并发编程,您可能没有运行任何隔离。你想看的地方是currentMirrorSystem().libraries,也可以用currentMirrorSystem().findLibrary(new Symbol('library_name'))

您需要了解该库,因为具有相同功能的函数或类Symbol可以在不同的库中使用,但具有完全不同的签名。

如何调用类表单 dart 库字符串或文件显示如何从库和类名中获取类镜像。

ClassMirror 包含方法、getter 和 setter。方法 mirror 不包含 getter 或 setter。

final Map<Symbol, MethodMirror> methods
final Map<Symbol, MethodMirror> getters
final Map<Symbol, MethodMirror> setters

话虽如此,您可能想查看http://api.dartlang.org/docs/bleeding_edge/serialization.html上的 dart 序列化,因为它可能已经完全符合您的要求。

于 2013-10-21T00:10:54.183 回答