Я не могу понять, как работает "isSubtypeOf" в зеркалах Dart
Согласно этому тесту, я не могу вызвать метод "method" с аргументом "list", потому что тип аргумента не совместим с типом параметра метода.
Где я не прав в моем тесте?
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
PS
Может быть, я что-то не понимаю, но это все еще не работает.
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;
Если одна из этих проверок верна, то это подтип.