2014-01-20 55 views
2

一些理智添加到我的生活,尋找instantiate()功能語法糖達特mirror庫:instantiate(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]); 

目前與mirrors 90%,我的相互作用會被覆蓋這一個功能。目前一味地削減和抄襲純粹的愚蠢。肯定比我聰明的人已經做到了!


這裏是instantiate(type, [constructor, positional, named])所有occassions:構造,位置的

  • 參數和命名都是可選的
  • 類型可以是Type,在實例化類型或類型
  • 的字符串表示
  • 構造函數:例如,新的Map.from(...) - 'from'是構造函數,'from'或#from
  • 位置:位置參數清單
  • 命名:在地圖的名稱參數,鑰匙可能是 '關鍵' 或#鍵
 
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

謝謝! - 你的新例子清楚地說明了發生了什麼。 –