2014-02-17 1 views
3
import 'dart:mirrors'; 


void main() { 
    var mirror = reflectClass(MyClass); 
    mirror.declarations.forEach((k, v){ 
    print(k); 
    if(v is VariableMirror){ 
     print(v.type); 
    } 
    }); 
} 


class MyClass{ 
    var aDynamic; 
    int anInt; 
} 

//prints: 
Symbol("aDynamic") 
TypeMirror on 'dynamic' 
Symbol("anInt") 
ClassMirror on 'int' 
Symbol("MyClass") 

есть способ, которым я могу получить ВТип TypeMirror является refelcting так Id любят возвращать тип из dynamic и типа int для 2 свойства в приведенном выше примере?Как получить объявленный тип с зеркалами?

ответ

4

VariableMirror.type - это правильный путь. Если он возвращает ClassMirror, вы можете использовать ClassMirror.reflectedType, чтобы получить объект Type для объявления.

VariableMirror.type будет типом объявлено переменным, а не типа любого значения переменного имеет место, так что пока это будет TypeMirror это не могло бы быть ClassMirror. Это также может быть TypeVariableMirror или TypedefMirror. Вы можете видеть на своем выходе, что зеркало для динамического корпуса - TypeMirror на dynamic. Поэтому вам нужно выяснить, как с этим бороться. Например, нет объекта типа, который представляет dynamic, поэтому вам придется обрабатывать его отдельно. Я бы, вероятно, просто конвертировал его в Object. Для TypedefMirrors вы можете вернуть Function. Я не уверен, что другие типы, которые не являются подтипом, могут быть.

Вот пример кода:

final _dynamicType = reflectType(dynamic); 

Type getDeclaredType(VariableMirror m) { 
    var t = m.type; 
    if (t is ClassMirror) return t.reflectedType; 
    if (t is TypedefMirror) return Function; 
    if (t == _dynamicType) return Object; 
    throw new ArgumentError("I don't know how to handle ${t}"); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^