2013-04-22 40 views
5

所有子类我在镖三类:查找镖

class A {} 

class B extends A{} 

class C extends A{} 

有一种方式来获得从A所有的子类?

编辑:

感谢亚历山大Ardhuin您的解决方案完美地工作!

我学习镖 我编辑你的代码,并把递归解决方案,一起来看看:

import 'dart:mirrors'; 

class A {} 
class B extends A{} 
class C extends A{} 
class D {} 
class E extends C {} 

bool isParent(String parent,ClassMirror clazz){ 
    var objectParentName = MirrorSystem.getName(clazz.superclass.simpleName); 
    if (objectParentName == "Object"){ 
    return parent == "Object"; 
    } 
    var result = parent == objectParentName; 
    if (!result){ 
    return isParent(parent,clazz.superclass); 
    } 
    return result; 
} 

List<String> findAllSubclasses(String clazz){ 
    var result = []; 
    final ms = currentMirrorSystem(); 
    ms.isolate.rootLibrary.classes.forEach((s,c) { 
    if (isParent(clazz,c)){ 
     result.add(MirrorSystem.getName(c.simpleName)); 
    } 
    }); 
    return result; 
} 


main(){ 
    var result = findAllSubclasses('A'); 
    print(result); 
} 
+0

我很好奇你究竟在努力完成什么。这是你的问题的答案只是一个简单的“不”的情况之一,如果不知道实际的目标是什么,我们不能真正提供帮助。 – 2013-04-22 20:34:56

+0

我会推荐使用可反射的lib,因为它更适合与dart2js一起使用,它也是由dart团队提供的 – Jonathan 2016-11-14 09:47:47

回答

6

Mirror library可以提供一些相关信息:

import 'dart:mirrors'; 

class A {} 
class B extends A{} 
class C extends A{} 
class D {} 

main(){ 
    final ms = currentMirrorSystem(); 
    ms.isolate.rootLibrary.classes.forEach((s,c) { 
    final parentClassName = MirrorSystem.getName(c.superclass.simpleName); 
    if (parentClassName == 'A') { 
     final className = MirrorSystem.getName(c.simpleName); 
     print('$className has A as super class'); 
    } 
    }); 
} 

输出将是:

C has A as super class 
B has A as super class 
+0

我认为您应该能够避免通过名称,并将超类与一个类镜像进行比较你要。为了适当的通用性,您还需要遍历所有库。 – 2013-04-23 14:31:30

+0

假设'E类扩展C {}' - E具有A作为超类,但是这不会包含在输出中。也许一些递归解决方案? – MarioP 2013-04-24 12:19:03

+0

当然,你必须做一些递归来获得所有的子类。这里的代码片段只是显示一个基本的例子来找到直接的孩子。必须细化才能获得所有的子类......我的目的是展示如何开始。 – 2013-04-24 12:32:30

1
import 'dart:io'; 
import 'package:reflection/reflection.dart'; 

void main() { 
    var type = FileSystemEntity; 
    var result = findAllSubclasses(typeInfo(type)); 
    var text = result.join("\r"); 
    print("=============================="); 
    print("Subclasses of '${type}'"); 
    print(text); 
} 

List<String> findAllSubclasses(TypeInfo type) { 
    var typeOrig = type.originalDeclaration; 
    var childs = MirrorSystemInfo.current.isolate.libraries.values 
    .select((library) => library.getClasses(BindingFlags.PRIVATE | BindingFlags.PUBLIC).values) 
    .selectMany((clazz) => clazz) 
    .where((clazz) => clazz.isA(type) && clazz.originalDeclaration != typeOrig); 
    return childs.toList(); 
} 
============================== 
Subclasses of FileSystemEntity 
File 
_Link 
Directory 
_File 
_Directory 
Link