2014-01-20 5 views
2

добавить немного здравомыслия к моей жизни, ищет 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; 
} 

ответ

5
import 'dart:mirrors'; 

void main() { 
    Type ktype = Klass; 
    Klass kinstance = new Klass(5); 
    // Constructor name 
    var ctor = const Symbol(""); 

    Klass test1 = instantiate(Klass, ctor, [1]); 
    Klass test2 = instantiate(ktype, ctor, [2]); 
    Klass test3 = instantiate(reflect(kinstance).type.reflectedType, ctor, [3]); 
    Klass test4 = instantiate(Klass, #fromString, ["4"]); 

    print(test1.i1); 
    print(test2.i1); 
    print(test3.i1); 
    print(test4.i1); 
} 

dynamic instantiate(Type type, Symbol constructorName, List positional, [Map named]) { 
    return reflectClass(type).newInstance(constructorName, positional, named).reflectee; 
} 

class Klass { 
    int i1; 
    Klass(int i1) { 
    this.i1 = (i1 is int) ? i1 : 0; 
    } 

    Klass.fromString(String i) { 
    i1 = int.parse(i, onError : (s) => i1 = 0); 
    } 
} 

Выход:

1 
2 
3 
4 
+0

есть какой-то причине вы объявили 'ctor' глобально а не в функции 'instantiate()'? –

+0

@ccyoung «есть ли причина, по которой вы объявили ctor глобально, а не внутри функции instantiate()?». Пожалуйста, посмотрите обновленный ответ. – mezoni

+0

спасибо! - ваш новый пример дал понять, что происходит. –