Динамическое преобразование типов с зеркалами
Проблема:
Можно ли привести тип динамически к типу?
Например, возможно ли это с помощью зеркал:
var reflectee = im.getField(simpleName).reflectee;
var converted = testVal as reflectee.runtimeType;
Контекст: я хочу сделать класс Mixin, который определяет validate
метод:
abstract class Validatable {
bool validate(Map document) {
}
}
Он будет перебирать переменные, определенные для класса, в который он включен, и проверяет, имеют ли переменные в документе один и тот же тип.
Теперь он работает с получением runtimeType
соответствующих переменных, но это очень ограничительный, поскольку он не приводит. Например:
var a = 1.1;
var b = 1;
print(a.runtimeType == b.runtimeType); // false
Было бы лучше, чтобы лучше проверить с as
, но я не вижу, как заставить это работать. Becase:
a = b;
print(a.runtimeType); // int
и не двойной, как можно было бы ожидать.
Является ли это возможным?
1 ответ
Решение
Вы могли бы использовать
import 'dart:mirrors';
class A {
}
class B extends A {
}
class C extends A {
}
void main(args) {
var a = 1.1;
var b = 1;
var x = reflect(b);
print(x.type.isSubtypeOf(reflectType(num)));
print(x.type.isAssignableTo(reflectType(num)));
print(x.type.isAssignableTo(reflectType(double)));
var myb = new B();
print(reflect(myb).type.isSubtypeOf(reflectType(A)));
print(reflect(myb).type.isAssignableTo(reflectType(A)));
print(reflect(myb).type.isAssignableTo(reflectType(C)));
}