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에 그렇게 이드 위의 예에서이 개 속성에 대한 dynamic의 입력 int의 유형을 반환하고자 refelcting되어 내가 유형을 얻을 수있는 방법이?거울로 선언 된 타입을 얻는 방법?

답변

4

VariableMirror.type은 올바른 방법입니다. ClassMirror를 반환하면 ClassMirror.reflectedType을 사용하여 선언에 대한 Type 객체를 가져올 수 있습니다. 그것은이 ClassMirror되지 않을 수도 TypeMirror에있을 것입니다 동안 있도록

VariableMirror.type는 변수의 선언 유형이 아닌 변수가 보유하고있는 값의 유형이 될 것입니다. TypeVariableMirror 또는 TypedefMirror 일 수도 있습니다. 출력에서 동적 케이스의 미러가 dynamic의 TypeMirror임을 알 수 있습니다. 그래서 어떻게 대처해야하는지 알아야합니다. 예를 들어 dynamic을 나타내는 Type 개체가 없으므로 별도로 처리해야합니다. 아마 Object으로 변환 할 것입니다. TypedefMirrors의 경우 Function을 반환 할 수 있습니다. 하위 유형이 아닌 다른 TypeMirrors가 실제로 있을지는 확실하지 않습니다.

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}"); 
} 
: 여기

몇 가지 예제 코드입니다