2012-10-18 52 views

回答

2

目前沒有什麼可以設置一個不存在的字段。 mirror API可用於設置已存在的字段,並可能最終擴展爲動態定義新字段。

+0

很酷。鏡像API應該讓我做我想做的事,我想。即我可以根據類和標識符構造一個默認實例,然後使用反射填充它的成員。謝謝! –

+0

嗨@JimBelton請注意,鏡子現在只是真正的虛擬機,直到我們開始使用dart2js。你在建立客戶端還是服務器應用程序 –

+0

Seth:我對dart感興趣,因爲它能夠同時用於服務器和客戶端。我對鏡像感興趣的是解析和持久性。客戶端不是必需的,但如果沒有它,解析必須在服務器端完成,因此在將來看到客戶端會很高興。 –

1

您也可以在類上使用「noSuchMethod」方法來攔截setter/getter,並將接收到的值存儲在地圖中。

例如(我不記得確切的語法...):

class Foo { 
    var _dynamicProperties = new Map<String,Object>(); 

    noSuchMethod(String function_name, List args) { 
    if (args.length == 0 && function_name.startsWith("get:")) { 
     //synthetic getter 
     var property = function_name.replaceFirst("get:", ""); 
     if (_dynamicProperties.containsKey(property)) { 
     return _dynamicProperties[property]; 
     } 
    } 
    else if (args.length == 1 && function_name.startsWith("set:")) { 
     //synthetic setter 
     var property = function_name.replaceFirst("set:", ""); 
     //if the property doesn't exist, it will only be added 
     _dynamicProperties[property] = args[0]; 
     return _dynamicProperties[property]; 
    } 

    super.noSuchMethod(function_name, args) 
    } 
} 

然後你就可以在你的代碼如下使用:

var foo = new Foo(); 
foo.bar = "Hello World"; 
print(foo.bar); 

當然,這可能會導致類型檢查程序不會檢查的拼寫錯誤,例如:

foo.bar = "Hello"; 
foo.baz = "Hello World"; // typo, meant to update foo.bar. 

有幾種方法可以使用type-checker va通過使用重定向的工廠構造函數和一個隱含的接口進行封閉,但是隨後開始變得複雜。

備註:這是JsonObject用於將json映射轉換爲類類型語法的用途。

相關問題