2014-04-06 19 views
1

根據此測試,我無法使用參數「list」調用方法「method」,因爲參數類型與方法參數的類型不兼容。我不能取消如何在Dart鏡像中使用「isSubtypeOf」

我在哪裏測試錯了?

import "dart:mirrors"; 

void main() { 
    var list = new List<String>(); 
    var listMirror = reflectClass(list.runtimeType); 
    // Is "List<String>" subtype of "List<String>"? 
    print(listMirror.isSubtypeOf(listMirror)); 
    // Method with parameter "List<String>" 
    var method = (List<String> list) {}; 
    var closure = reflect(method) as ClosureMirror; 
    var function = closure.function; 
    var parameter = function.parameters.first; 
    // Is "List<String>" subtype of "List<String>"? 
    print(parameter.type.isSubtypeOf(listMirror)); 
    print(listMirror.isSubtypeOf(parameter.type)); 
    // Invoke method with arg: "List<String>" on param "List<String>" 
    method(list); 
} 

輸出:

true 
false 
false 

P.S.

也許我不明白,但它仍然不起作用。

import "dart:mirrors"; 

void main() { 
    var stringMirror = reflectClass(String); 
    // Query "List<int> get codeUnits" 
    MethodMirror method = stringMirror.declarations.values 
     .where((e) => e.simpleName == #codeUnits).first; 

    // List<int> 
    var returnType = method.returnType; 
    print(returnType); 

    // List 
    var baseType = reflectClass(List); 
    print(baseType); 

    // List<int> is List 
    print(returnType.isSubtypeOf(baseType)); 
} 

輸出:

ClassMirror on 'List' 
ClassMirror on 'List' 
false 

回答

1

此行是罪魁禍首:

var listMirror = reflectClass(list.runtimeType); 

,如果你使用返回

ClassMirror on '_GrowableList' 
var listMirror = reflectType(List); 

它應該工作。

你可以在你需要的在運行時

var listMirror = reflect(list).type.superinterfaces; 
... 
listMirror.forEach((e) => print(parameter.type.isSubtypeOf(e))); 

視情況而定,以得到一個值的類型,你可能需要進行額外的檢查與

reflect(list).type.mixin; 

如果這些檢查之一這是真的,它是一個亞型。

+0

我擴展了我的答案,也許包括你想要的。 –

+0

如果您將'reflectClass'更改爲'reflectType',則會打印'true'。那是你要的嗎? –