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 は反映されていません。

Isolate は並行プログラミング用であり、おそらく実行中の Isolate はありません。見たい場所はcurrentMirrorSystem().libraries、または を使用できますcurrentMirrorSystem().findLibrary(new Symbol('library_name'))

Symbol同じ関数またはクラスが別のライブラリにある可能性がありますが、完全に異なるシグネチャを持っているため、ライブラリを知る必要があります。

dart ライブラリ文字列またはファイルからクラスを呼び出す方法は、ライブラリとクラス名からクラス ミラーを取得する方法を示しています。

ClassMirror には、メソッド、ゲッター、およびセッターが含まれています。メソッド ミラーには、ゲッターまたはセッターが含まれていません。

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 に答える