0

如何使用字符串访问对象实例中的属性属性?我想自动更改我将在表单中进行的更改,例如响应以下对象:

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

表格有例如三个numericUpDown分别称为position_X, position_Y, position_Z; 取而代之的是三个事件回调:

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

  }

我会有一个回调,它可以从控件名称/标签自动设置模型中的特定属性

下面是描述我想要的目的的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 回答