2012-11-08 11 views

risposta

8

Ci sono diverse cose che si possono ottenere con Mirrors.

Ecco un esempio di come impostare i valori delle classi e come chiamare i metodi in modo dinamico:

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", []); 
} 

Nel caso in cui ci si chiede, im è un InstanceMirror, che riflette sostanzialmente l'istanza page.

C'è anche un'altra questione: Is there a way to dynamically call a method or set an instance variable in a class in Dart?

6

È possibile utilizzare Dart Mirror API per eseguire tale operazione. Specchio API non è pienamente attuato, ma ora ecco come potrebbe funzionare:

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

La chiamata a 'Futures.wait()' ha poco senso qui. Puoi ometterlo e il risultato è lo stesso. 'Futures.wait()' restituisce un 'Future' che completa quando le azioni date sono complete, quindi, devi davvero scrivere un' .then() 'per farlo funzionare correttamente. Ovviamente ora funziona per fortuna visto che le operazioni non sono asincrone :) –

+0

Grazie per il tuo commento. Sono nuovo per l'utilizzo futuro e mi sono confuso con la proposta di "attesa" www.dartbug.com/104 –

0

È possibile utilizzare Serializable

Ad esempio:

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']}"); 
} 
Problemi correlati