2012-11-08 12 views

Odpowiedz

8

Istnieje kilka rzeczy, które można osiągnąć z Mirrors.

Oto przykład jak ustawić wartości klas i sposób wywoływania metod dynamicznie:

import 'dart:mirrors'; 

class Page { 
    var name; 

    method() { 
    print('called!'); 
    } 
} 

void main() { 
    var page = new Page(); 

    var im = reflect(page); 

    // Set values. 
    im.setField("name", "some value").then((temp) => print(page.name)); 

    // Call methods. 
    im.invoke("method", []); 
} 

W przypadku wątpliwości, im jest InstanceMirror, które w zasadzie odzwierciedla instancji page.

Jest też inna kwestia: Is there a way to dynamically call a method or set an instance variable in a class in Dart?

6

Do wykonania takiej czynności można użyć Dart Mirror API. Lustro API nie jest w pełni wdrożony, ale teraz oto jak to może działać:

import 'dart:mirrors'; 

class Page { 
    String name; 
} 

main() { 
    final page = new Page(); 
    var value = "value"; 

    InstanceMirror im = reflect(page); 
    im.setField("name", value).then((_){ 
    print(page.name); // display "value" 
    }); 
} 
+1

Wywołanie funkcji 'Futures.wait()' ma tu niewielki sens. Możesz go pominąć, a wynik jest taki sam. 'Futures.wait()' zwraca 'Future', która kończy się, gdy podane akcje zostaną zakończone, więc naprawdę musisz napisać' .then() ', aby poprawnie działało. Oczywiście teraz działa na szczęście, ponieważ operacje nie są asynchroniczne :) –

+0

Dzięki za komentarz. Jestem nowym użytkownikiem Future i myliłem się z propozycją 'await' www.dartbug.com/104 –

0

Można użyć Serializable

Na przykład:

import 'package:serializable/serializable.dart'; 

@serializable 
class Page extends _$PageSerializable { 
    String name; 
} 

main() { 
    final page = new Page(); 
    var attribute = "name"; 
    var value = "value"; 

    page["name"] = value; 
    page[attribute] = value; 

    print("page.name: ${page['name']}"); 
} 
Powiązane problemy