0

文字列を使用してオブジェクトインスタンスのプロパティのプロパティにアクセスするにはどうすればよいですか?たとえば、以下のオブジェクトに応答するなど、フォームで行う変更を自動化したいと思います。

class myObject{
   Vector3 position;
   public myObject(){
       this.position = new Vector3( 1d,2d,3d);
   }
};

フォームには、たとえば、それぞれ、、、;と呼ばれる3つがありますnumericUpDown。代わりに、次のようなイベントの3つのコールバックがあります。position_Xposition_Yposition_Z

private void positionX_ValueChanged(object sender, EventArgs e)
  { 
    // this.model return myObject
    this.model().position.X = (double)  ((NumericUpDown)sender).Value;

  }

コントロール名/タグからモデルに特定の属性を自動的に設定できるコールバックが1つあります

以下は私が欲しい目的を説明するjavascriptです:)

position_Changed( sender ){
   var prop = sender.Tag.split('_'); ; // sender.Tag = 'position_X';      
   this.model[ prop[0] ] [ prop[1] ] = sender.Value;
}
4

2 に答える 2

3

これを行うには、リフレクションツリーまたはエクスプレッションツリーのいずれかを使用できます。

単純な反射方法(それほど高速ではありませんが、用途が広い):

object model = this.model();
object position = model.GetType().GetProperty("position").GetValue(model);
position.GetType().GetProperty("X").SetValue(position, ((NumericUpDown)sender).Value);

注:が構造体の場合Vector3、期待どおりの結果が得られない可能性があります(ただし、コード自体ではなく、構造体とボクシングに関係します)。

于 2012-09-07T22:02:00.090 に答える
0

本質的にあなたが探しているものである前の答えを補完するために:

object model = this.model();
object position = model.GetType().GetProperty("position").GetGetMethod().Invoke(model, null);
var propName = (string) ((NumericUpDown)sender).Tag;
position.GetType().GetProperty(propName).GetSetMethod().Invoke(model, new [] {((NumericUpDown)sender).Value});

つまり、のTagプロパティを使用して、インスタンスが「バインド」されているControlVector3オブジェクトのプロパティを指定できます。NumericUpDown

于 2012-09-07T22:05:28.833 に答える