10

ダーツでは、文字列からクラスをインスタンス化することは可能ですか?

例えば:

  • javascript のバニラ:
var myObject = window[classNameString];
  • 目的 C:
id myclass = [[NSClassFromString(@"MyClass") alloc] init];
4

4 に答える 4

4

適切に機能させるには、ライブラリ名とクラス名を知る必要があります。両方を知っていると仮定すると、以下の例は をインスタンス化し、TestClassそれを呼び出しdoStuffます。

library test;

import "dart:mirrors";

class TestClass {
  doStuff() => print("doStuff was called!");
}

main() {
  MirrorSystem mirrors = currentMirrorSystem();
  LibraryMirror lm = mirrors.libraries['test'];
  ClassMirror cm = lm.classes['TestClass'];
  Future tcFuture = cm.newInstance('', []);
  tcFuture.then((InstanceMirror im) {
    var tc = im.reflectee;
    tc.doStuff();
  });
}

このソリューションに関する注意事項:

  1. クラスをロードしようとしているライブラリtestは、既に VM にインポートされているため、このケースは少し簡単になります。
  2. 呼び出しnewInstanceにより、コンストラクターにパラメーターを渡すことができます。位置引数は実装されていますが、名前付きパラメーターはまだ実装されていません (M2 リリースの時点)。
  3. newInstanceはFutureを返し、isolate間で動作できるようにします。
于 2013-01-09T19:32:49.303 に答える
3

試す:

Map models = {"Player": Player.instatiate};
var player = models["Player"]();

class Player{
  static instatiate() => Player();
}
于 2020-03-25T00:50:19.380 に答える