1

如果有Type,使用Mirrors可以获取Type名称。相反,给定 aType的名字,你如何得到Type

例如,来自以- 为中心的Dart版本Angular

索引.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,如何Typeclassand中获取Object,并且知道如何实例化 a Type。缺少最后一块 - 你是如何Type从它的名字中得出的?

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");
}

输出:

镜子:“酒吧”上的 ClassMirror

于 2013-12-08T06:45:08.983 回答