1

がある場合Type、を使用しMirrorsて名前を取得できますType。逆に、Typeの名前が与えられた場合、どうやって ? を取得しTypeますか?

たとえば、 のDart中心のバージョンからAngular:

index.html

<form ng-controller='word?reset=true' >
 ...
</form>

mylib.dart

class Controller {
  Controller( Brando brando, Element elem, Map args ) { ... }
}
class Word extends Controller { ... }
class LangList extends Controller { ... }

// Brando, the godfather
class Brando {
  ...
  void compile( Element el ) {
    ...
    // add controller
    if( el.attributes.contains( 'ng-controller' ) {
      var name = el.attributes.getTypeName();  &lt;== "Word"
      var args = el.attributes.getTypeArgs();  &lt;== { 'reset': 'true' }
      var type = &lt;get type from camelized Type name&gt;  &lt;=== how??
      this.controllers.add( reflectClass(type).newInstance(
         const Symbol(''), [this,el,args]).reflectee );  &lt;=== instance from type
    }
    ...
  }
}

の名前を取得する方法、とからType取得する方法、 をインスタンス化する方法を知っています。最後のピースがありません -その名前からどのように派生しますか?TypeclassObjectTypeType

4

1 に答える 1

3

注: ミラー API は「不安定」であるため、この回答は時間の経過とともに変わる可能性があります。 *注: これにより、生成された JavaScript が肥大化する可能性があります (参照): https://api.dartlang.org/docs/channels/stable/latest/dart_mirrors/MirrorSystem.html#getSymbol *

import 'dart:mirrors';
class Bar {
}

ClassMirror findClassMirror(String name) {
  for (var lib in currentMirrorSystem().libraries.values) {
    var mirror = lib.declarations[MirrorSystem.getSymbol(name)];
    if (mirror != null) return mirror;
  }
  throw new ArgumentError("Class $name does not exist");
}

void main() {
  ClassMirror mirror = findClassMirror("Bar");
  print("mirror: $mirror");
}

出力:

mirror: 「Bar」の ClassMirror

于 2013-12-08T06:45:08.983 に答える