2013-04-22 1 views
5

의 모든 서브 클래스를 찾기?나는 세 다트에서 수업을 다트

편집 :

감사 알렉산드르 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

당신이 실제로 성취하고자하는 것이 궁금합니다. 이것은 귀하의 질문에 대한 대답이 단순한 "아니오"인 사례 중 하나이며, 실제 목표가 무엇인지 모른 채로도 그 이상을 도울 수는 없습니다. –

+0

반사 형 lib를 사용하는 것이 좋습니다. 왜냐하면 dart2js와 함께 사용하는 것이 더 좋으며 다트 팀도 제공하기 때문입니다. – Jonathan

답변

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

나는 이름을 거치지 않아야하며 수퍼 클래스를 클래스 미러와 비교해야한다고 생각합니다 네가 원해. 적절한 일반성을 위해 모든 라이브러리를 반복해야합니다. –

+0

'클래스 E가 C {}'를 확장한다고 가정하자. - E는 A를 수퍼 클래스로 가지지 만 출력에는 포함되지 않는다. 어쩌면 재귀적인 해결책일까요? – MarioP

+0

물론, 모든 하위 클래스를 가져 오기 위해 재귀를 만들어야합니다. 여기에있는 코드 스 니펫은 직접적인 하위 항목을 찾는 기본 예제 만 보여줍니다. 모든 하위 클래스를 얻으려면 세련 되야 만합니다 ... 시작하려는 방법을 보여 주려는 의도였습니다. –

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