2012-05-10 16 views
3

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のドキュメントが便利になるかもしれません。

関連する問題