2014-02-18 1 views
6

из dartdocs для InstanceMirror.type:При каких обстоятельствах reflexClass (o.runtimeType) возвращает другой результат из-за отражения (o) .type?

«Возвращает зеркало на фактический класс reflectee класс reflectee может отличаться от объекта, возвращаемого вызовом runtimeType на reflectee..»

поэтому при каких обстоятельствах reflectClass(o.runtimeType) возвращает другой результат от reflect(o).type?

Я попытался с примером кода:

import 'dart:mirrors'; 

class A{} 

void main() { 

    var string = "str"; 
    var boolean = true; 
    var integer = 5; 
    var map = {}; 
    var list = []; 
    var custom = new A(); 

    var strRunT = string.runtimeType; 
    var strRefT = reflect(string).type.reflectedType; 
    var boolRunT = boolean.runtimeType; 
    var boolRefT = reflect(boolean).type.reflectedType; 
    var intRunT = integer.runtimeType; 
    var intRefT = reflect(integer).type.reflectedType; 
    var mapRunT = map.runtimeType; 
    var mapRefT = reflect(map).type.reflectedType; 
    var listRunT = list.runtimeType; 
    var listRefT = reflect(list).type.reflectedType; 
    var cusRunT = custom.runtimeType; 
    var cusRefT = reflect(custom).type.reflectedType; 

    print('string'); 
    print('runtimeType = $strRunT'); 
    print('reflectedType = $strRefT'); 
    print('runT == refT = ${strRunT == strRefT}'); 
    print('runT == String = ${strRunT == String}'); 
    print('refT == String = ${strRefT == String}'); 
    print(''); 
    print('bool'); 
    print('runtimeType = $boolRunT'); 
    print('reflectedType = $boolRefT'); 
    print('runT == refT = ${boolRunT == boolRefT}'); 
    print('runT == bool = ${boolRunT == bool}'); 
    print('refT == bool = ${boolRefT == bool}'); 
    print(''); 
    print('integer'); 
    print('runtimeType = $intRunT'); 
    print('reflectedType = $intRefT'); 
    print('runT == refT = ${intRunT == intRefT}'); 
    print('runT == int = ${intRunT == int}'); 
    print('refT == int = ${intRefT == int}'); 
    print(''); 
    print('map'); 
    print('runtimeType = $mapRunT'); 
    print('reflectedType = $mapRefT'); 
    print('runT == refT = ${mapRunT == mapRefT}'); 
    print('runT == Map = ${mapRunT == Map}'); 
    print('refT == Map = ${mapRefT == Map}'); 
    print(''); 
    print('list'); 
    print('runtimeType = $listRunT'); 
    print('reflectedType = $listRefT'); 
    print('runT == refT = ${listRunT == listRefT}'); 
    print('runT == List = ${listRunT == List}'); 
    print('refT == List = ${listRefT == List}'); 
    print(''); 
    print('custom'); 
    print('runtimeType = $cusRunT'); 
    print('reflectedType = $cusRefT'); 
    print('runT == refT = ${cusRunT == cusRefT}'); 
    print('runT == A = ${cusRunT == A}'); 
    print('refT == A = ${cusRefT == A}'); 
    print(''); 
} 


//OUTPUT 
string 
runtimeType = String 
reflectedType = String 
runT == refT = false 
runT == String = true 
refT == String = false 

bool 
runtimeType = bool 
reflectedType = bool 
runT == refT = true 
runT == bool = true 
refT == bool = true 

integer 
runtimeType = int 
reflectedType = int 
runT == refT = false 
runT == int = true 
refT == int = false 

map 
runtimeType = _LinkedHashMap 
reflectedType = _LinkedHashMap 
runT == refT = true 
runT == Map = false 
refT == Map = false 

list 
runtimeType = List 
reflectedType = List 
runT == refT = true 
runT == List = false 
refT == List = false 

custom 
runtimeType = A 
reflectedType = A 
runT == refT = true 
runT == A = true 
refT == A = true 

дополнительно есть в любом случае сравнения 2 Type с и найти, если они равны? как показано выше, показывает, что 2 отдельных типа int не равны с использованием обычного оператора ==.

ответ

4

Другие результаты, если класс отменяетruntimeType участник. В основном объект может лежит в своем типе.

Вы можете прочитать больше в теме: example of wanting to override runtimeType?.

4

Примером того, что сказал Александр, является тип String. В dart: core класс String переопределяет runtimeType, чтобы всегда возвращать тип базового класса String. Однако в VM существует несколько подтипов времени выполнения для String. то есть одиночные символьные строки, строки ascii, строки utf8. Зеркало api возвращает реальный базовый подтип.

См. Gilad's (дизайнер API) answer на этот вопрос.

"есть ли способ сравнения 2 типов и нахождения, если они равны?"

Есть три новые методы coming soon, которые позволяют сравнивать типы при использовании зеркала: TypeMirror.isSubtypeOf, TypeMirror.isAssignableTo, ClassMirror.isSubclassOf.

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

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