2012-05-10 1 views
3

Я хотел бы быть в состоянии сделать что-то подобное с конструктором класса Dart:Есть ли способ динамического вызова метода или установки переменной экземпляра в классе в Dart?

class Model { 

    // ... setting instance variables 

    Model(Map fields) { 
    fields.forEach((k,v) => this[k] = v); 
    } 

} 

Очевидно, что это не работает, потому что this не метод []=.

Есть ли способ заставить его работать, или это просто не «способ стрельбы» в этом? Если это не так, не могли бы вы показать мне, какой был бы правильный способ справиться с этим?

+1

Рассмотрите возможность изменения принятого ответа, потому что другой ответ работает отлично для меня! – Tower

ответ

1

В настоящее время нет. Вам придется подождать, пока в Дарт придет отражение, прежде чем что-то подобное (надеюсь) станет возможным. До тех пор ваш лучший выбор - это, вероятно, сделать это в конструкторе. В качестве альтернативы вы можете попытаться использовать что-то вроде JsonObject, которое позволяет вам напрямую инициализировать его с карты (для объяснения того, как это работает, отметьте this сообщение в блоге).

6

Вы можете использовать Mirrors:

InstanceMirror im = reflect(theClassInstance); 

im.invoke('methodName', ['param 1', 2, 'foo']).then((InstanceMirror value) { 
    print(value.reflectee); // This is the return value of the method invocation. 
}); 

Таким образом, в вашем случае, вы можете сделать это (так как у вас есть сеттеры):

import 'dart:mirrors'; 

class Model { 
    Model(Map fields) { 
    InstanceMirror im = reflect(this); 
    fields.forEach((k, v) => im.setField(k, v)); // or just fields.forEach(im.setField); 
    } 
} 

Документация InstanceMirror может пригодиться.