Отразить неимпортированный класс

Я пытаюсь получить свойства динамического имени класса (также пытаюсь создать его экземпляр), но следующий код не работает, потому что я думаю, что мне нужно импортировать файл дротика, который имеет код класса в файле, где я хочу отразить это:

//I import the file in other Dart file
import 'MyClass.dart'; //This only have a class named MyClass with some properties
import 'OtherClass.dart'

class mainClass {
  void mainFunction () {
    var properties = OtherClass.getProperties('MyClass');
  }
}

Вот содержимое OtherClass:

import "dart:mirrors";

class OtherClass {
  static getProperties (String className) {
    ClassMirror cm = reflectClass(className);
    for (var m in cm.declarations.values)
      print(MirrorSystem.getName(m.simpleName));
  }
}

есть ли способ отразить класс, который не импортирован в настоящий файл Dart?

Надеюсь, это имеет смысл, спасибо заранее.


person Ultranuke    schedule 03.11.2015    source источник


Ответы (1)


Сначала вам нужно найти библиотеку, содержащую класс. Используйте currentMirrorSystem().libraries, чтобы получить все библиотеки, импортированные в ваше приложение. Если вы хотите избежать двусмысленностей, добавьте в свою библиотеку уникальные объявления библиотек и передайте имя библиотеки в getProperties() для точного поиска.

import "dart:mirrors";

class OtherClass {
  static getProperties(String className) {
    var classSymbol = new Symbol(className);
    var libs = currentMirrorSystem().libraries;
    var foundLibs = libs.keys.where((lm) =>
        libs[lm].declarations.containsKey(classSymbol) &&
            libs[lm].declarations[classSymbol] is ClassMirror);
    if (foundLibs.length != 1) {
      throw 'None or more than one library containing "${className}" class found';
    }
    ClassMirror cm = libs[foundLibs.first].declarations[classSymbol];
    for (var m
        in cm.declarations.values) print(MirrorSystem.getName(m.simpleName));
  }
}
person Günter Zöchbauer    schedule 03.11.2015
comment
Что говорит Гюнтер. Кроме того, я бы рекомендовал передавать имя класса как символ, а не строку. - person lrn; 03.11.2015