2015-11-03 53 views
2

我想获得动态类名称的属性(也试图实例化它)但接下来的代码不起作用,因为我认为我需要导入具有该类的dart文件在这里我想反映在文件中的代码:反映非导入类

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

反正是有反映的不是实际的飞镖文件中导入一个类?

希望这是有道理的,在此先感谢。

回答

2

您需要先找到包含该类的库。使用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)); 
    } 
} 
+1

Günther说什么。另外,我建议将该类的名称作为符号传递,而不是字符串。 – lrn