为了给我的生活增添一些理智,寻找Dart库 instantiate()中作为语法糖的功能:mirrorinstantiate( class|type|instance, argArray )
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 可以是
Type, 实例化类型, 或该类型的字符串表示 - 构造函数:例如,new Map.from(...) - 'from' 是构造函数,'from' 或 #from
- 位置:列表中的位置参数
- named: 命名 Map 中的参数,键可以是 'key' 或 #key
动态实例化(动态 v_type,[动态 v_constructorName,列表 v_positional,地图 v_named]){
类型类型 =
(_type 是类型)?v_type
: (v_type 是字符串) ? str2Type( v_type )
:反射(v_type).type.reflectedType;
地图 v_named2 =
(v_named 是地图)?v_named
: (v_positional 是地图) ? v_positional
: (v_constructorName 是地图) ? v_constructorName
: {};
地图命名 = {};
v_named2.keys.forEach( (k) => named[(k is Symbol)?k:new Symbol(k)] = v_named2[k] );
列表位置 =
(v_positional 是列表)?v_positional
: (v_constructorName 是列表) ? v_constructorName : [];
符号构造函数名称 =
(v_constructorName 是符号)?v_constructorName
: (v_constructorName 是字符串) ? 符号(v_constructorName)
: 常量符号('');
return reflectClass(type).newInstance(constructorName, positional, named).reflectee;
}