2014-02-17 39 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我還想在上面的例子中的2個屬性返回一個類型的dynamicint類型的?如何用鏡子獲取聲明類型?

回答

4

VariableMirror.type是正確的路要走。如果它返回一個ClassMirror,那麼你可以使用ClassMirror.reflectedType來獲取聲明的Type對象。

VariableMirror.type將是聲明類型的變量,而不是變量保存的任何值的類型,因此,雖然這將是它可能不是一個ClassMirror一個TypeMirror的。它也可以是TypeVariableMirror或TypedefMirror。您可以在輸出中看到動態大小寫的鏡像是dynamic上的TypeMirror。所以你必須弄清楚如何處理這些。例如,沒有代表dynamic的Type對象,所以你必須分開處理。我可能會將其轉換爲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}"); 
}