Ссылайтесь на классы по их тегу метаданных

Можно ли найти (возможно, с помощью зеркального API) все классы (в моем проекте) с некоторой аннотацией метаданных?

Пример:

import 'baz.dart'; //more tagged classes

@Tag(#foo)
class A{

}
@Tag(#foo)
class B{

}

void main() {
 List<ClassMirror> li = getClassMirrorsByTag(#foo);
}

person JAre    schedule 08.06.2014    source источник
comment
Немного исправил. Теперь все ясно.   -  person JAre    schedule 09.06.2014


Ответы (1)


Я нашел ответ:

getClassMirrorsByTag.dart

library impl;
@MirrorsUsed(metaTargets: Tag)
import 'dart:mirrors';

class Tag {
  final Symbol name;
  const Tag(this.name);
}
List<ClassMirror> getClassMirrorsByTag(Symbol name) {
  List<ClassMirror> res = new List<ClassMirror>();
  MirrorSystem ms = currentMirrorSystem();
  ms.libraries.forEach((u, lm) {
    lm.declarations.forEach((s, dm) {
      dm.metadata.forEach((im) {
        if ((im.reflectee is Tag) && im.reflectee.name == name) {
          res.add(dm);
        }
      });
    });
  });
  return res;
}

extra.dart

library extra;
import 'getClassMirrorsByTag.dart';

@Tag(#foo)
class C {}

main.dart

library  main;
import 'getClassMirrorsByTag.dart';
import 'extra.dart';
@Tag(#foo)
class A{}
@Tag(#baz)
class B{}


void main() {
  print(getClassMirrorsByTag(#foo));
}

вывод:

[ClassMirror на «A», ClassMirror на «C»]

person JAre    schedule 09.06.2014
comment
список‹ClassMirror› res = новый список‹ClassMirror›(); отлично работал с классами, но не с функциями, у вас есть идея, если я хочу использовать то же самое с функциями, что мне использовать вместо этой строки, спасибо - person Hasan A Yousef; 09.11.2014
comment
@HasanAYousef Зеркала функций имеют тип MethodMirror и классы ClassMirror Если вы замените его на List res = new List();, у вас будет коллекция зеркал смешанного типа. - person JAre; 09.11.2014
comment
спасибо, не могли бы вы помочь с этим stackoverflow.com/questions/26826521/ - person Hasan A Yousef; 09.11.2014