2013-01-17 27 views
3

假設我有List這樣的String如何在Dart中使用鏡像獲取泛型類型變量的具體類型?

var myList = new List<String>(); 

我怎樣才能弄清楚,myList是使用鏡子String s的List


我嘗試了使用ClassMirrortypeVariables但鏡子似乎只是描述gerneric List類。

InstanceMirror im = reflect(myList); // InstanceMirror on instance of 'List' 
ClassMirror cm = im.type; // ClassMirror on 'List' 
print(cm.typeVariables['E']) // TypeVariableMirror on 'E' 

我也發現了這個文檔中,但我還沒有找到一個ClassMirror實例,其中訪問originalDeclaration不會引發NoSuchMethodError

最終ClassMirror originalDeclaration

在此類型的原始聲明的反射鏡。

對於大多數類,它們是它們自己的原始聲明。但是,對於通用的 類,原始類 聲明(其中包含未綁定的類型變量)和實例化類型爲 的泛型類(具有綁定類型變量)存在區別。

+0

FWIW我打開這個錯誤以跟蹤:http://code.google.com/p/dart/issues/detail?id = 7957您可能想要在出現更改時向其發送通知。 –

+1

請注意,您的示例應該更準確,並以此爲例:'var myList = new List ()'因爲在Dart中,類型是可選的,所以您想顯示實際的對象實例。 –

+0

@SethLadd謝謝你的回答。我相應地改變了我的例子。所以我想答案將是「只有當這個bug被修復時纔可能」?那麼這不應該是(接受的)答案嗎? –

回答

6

2種可能的方法。

第一種方法是使用is操作者檢查變量的類型,因爲它是比反射更好的性能:

var myList = new List<String>(); 
print(myList is List<int>); // false 
print(myList is List<String>); // true 

第二種方法是使用ClassMirror.typeArguments

import 'dart:mirrors'; 
var myList = new List<String>(); 

Map typeArguments = reflect(myList).type.typeArguments; 
print(typeArguments); // {Symbol("T"): ClassMirror on 'String'} 

ClassMirror firstTypeArg = typeArguments[typeArguments.keys.first]; 
print(firstTypeArg.reflectedType); // String