在C#中按字符串获取对象属性的属性

时间:2012-09-07 21:57:17

标签: c#

如何使用字符串访问对象实例中属性的属性? 我想自动化我将在表单中做出的更改,例如回复下面的对象:

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

表单有三个numericUpDown分别调用position_Xposition_Yposition_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;
}

2 个答案:

答案 0 :(得分:3)

您可以使用反射树或表达式树来执行此操作。

简单的反射方式(不是非常快但多才多艺):

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

注意:如果Vector3是一个结构,您可能无法获得预期的结果(但这与结构和装箱有关,而不是代码本身)。

答案 1 :(得分: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的{​​{1}}属性来指定Control实例“绑定”到您的Vector3对象的哪个属性。