добавить немного здравомыслия к моей жизни, ищет instantiate()
функций как синтаксический сахар в mirror
библиотеки Дарта: instantiate(class|type|instance, argArray)
потребности Dart зеркало Instantiate() функция
class Klass {
int i1;
Klass(int i1) {
this.i1 = (i1 is int) ? i1 : 0;
}
}
type ktype = Klass;
Klass kinstance = new Klass(5);
Klass test1 = instantiate(Klass, [5]);
Klass test2 = instantiate(ktype, [5]);
Klass test3 = instantiate(kinstance, [5]);
В настоящее время 90% мое взаимодействие с mirrors
будет покрыт эта одна функция. в настоящее время слепо вырезать и копировать из чистой глупости. конечно, кто-то умнее меня сделал это уже!
здесь instantiate(type, [constructor, positional, named])
всех случаи жизни:
- аргументов конструкторы, позиционной и именованный является необязательным
- типа может быть
Type
, в конкретизированном типе, или строковое представление типа - конструктор: например, новый Map.from (...) - 'from' - это конструктор, либо 'from', либо #from
- positional: позиционные аргументы в Список
- по имени: имена аргументов в карте, ключи могут быть 'ключ' или #key
dynamic instantiate(dynamic v_type, [dynamic v_constructorName, List v_positional, Map v_named]) { Type type = (_type is Type) ? v_type : (v_type is String) ? str2Type(v_type) : reflect(v_type).type.reflectedType; Map v_named2 = (v_named is Map) ? v_named : (v_positional is Map) ? v_positional : (v_constructorName is Map) ? v_constructorName : {}; Map named = {}; v_named2.keys.forEach((k) => named[(k is Symbol)?k:new Symbol(k)] = v_named2[k]); List positional = (v_positional is List) ? v_positional : (v_constructorName is List) ? v_constructorName : []; Symbol constructorName = (v_constructorName is Symbol) ? v_constructorName : (v_constructorName is String) ? Symbol(v_constructorName) : const Symbol(''); return reflectClass(type).newInstance(constructorName, positional, named).reflectee; }
есть какой-то причине вы объявили 'ctor' глобально а не в функции 'instantiate()'? –
@ccyoung «есть ли причина, по которой вы объявили ctor глобально, а не внутри функции instantiate()?». Пожалуйста, посмотрите обновленный ответ. – mezoni
спасибо! - ваш новый пример дал понять, что происходит. –