dart, возможно ли для данного экземпляра класса получить список всех типов, от которых он наследуется, в порядке возрастания?

если у меня есть:

List<Type> getInheritanceStructure(){
    // TODO
}

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

var c = new C();

List<Type> types = getInheritanceStructure(c);

types.forEach((type) => print(type));

//should print out:
C
B
A
Object

можно ли получить список таких типов?


person Daniel Robinson    schedule 18.02.2014    source источник
comment
Мой ответ на этот вопрос stackoverflow.com/questions/20743346 делает что-то подобное. Он просматривает все базовые классы, если находит статический метод с заданным именем. Это должно помочь вам начать.   -  person Günter Zöchbauer    schedule 18.02.2014
comment
stackoverflow.com/questions/16150437   -  person Günter Zöchbauer    schedule 18.02.2014


Ответы (1)


Вам нужно зеркало класса, оттуда вы сможете пройтись по всем суперклассам.

List<Type> getInheritanceStructure(Object o){
    ClassMirror baseClass = reflectClass(o.runtimeType);
    return walkSuperclasses(baseClass);
}

List<Type> walkSuperclasses(ClassMirror cm) {
    List<Type> l = [];
    l.add(cm.reflectedType);
    if(cm.superclass != null) {
        l.addAll(walkSuperclasses(cm.superclass));
    }
    return l;
}
person MarioP    schedule 18.02.2014
comment
спасибо, есть ли разница между использованием reflectClass(o.runtimeType) и reflect(o).type? - person Daniel Robinson; 18.02.2014
comment
Не в этом примере, но видимо разница есть. Из Dartdocs для InstanceMirror.type: класс отражателя может отличаться от объекта, возвращаемого при вызове [runtimeType] для отражателя. Я понятия не имею, при каких обстоятельствах это имеет какой-либо эффект, извините. - person MarioP; 18.02.2014
comment
да, это то, что я прочитал и вызвал мой вопрос, спасибо за информацию в любом случае. - person Daniel Robinson; 18.02.2014
comment
@ 0xor1 Я нашел пример, где он отличается - попробуйте оба метода, например, для переменной типа String или int. Или с дженериками метод o.runtimeType не работает. - person MarioP; 18.02.2014