如何使用字符串访问对象实例中属性的属性? 我想自动化我将在表单中做出的更改,例如回复下面的对象:
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;
}
答案 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对象的哪个属性。