我继承了一个代码库,我正在编写一个小工具来为它更新数据库。该代码使用像SubSonic这样的数据访问层(但它是本土的)。对象有很多属性,比如“id”,“templateFROM”和“templateTO”,但有50个属性。
在屏幕上,我无法在自己的文本框中显示所有50个属性以进行数据输入,因此我有一个包含所有可能属性的列表框,以及一个用于编辑的文本框。当他们在列表框中选择一个属性时,我在文本框中填入属性对应的值。然后我需要在完成编辑后更新属性。
现在我正在使用2个巨大的switch case语句。这对我来说似乎很愚蠢。有没有办法动态告诉C#我想要设置或获取的属性?也许像:
entObj."templateFROM" = _sVal;
...
答案 0 :(得分:8)
您需要为该任务使用System.Reflection。
entObj.GetType().GetProperty("templateFROM").SetValue(entObj, _sVal, null);
这应该对你有帮助。
答案 1 :(得分:2)
您想要的是reflection。
答案 2 :(得分:2)
我认为你所寻找的是反思。这是一个小片段:
Type t = entObj.GetType();
t.GetProperty("templateFROM").SetValue(entObj, "new value", null);
更多可用性说明(而不是回答问题说明),您可能需要考虑使用PropertyGrid控件。该列表框/文本框听起来使用它可能非常繁琐。
答案 3 :(得分:1)
PropertyInfo[] properties = typeof(YourClass).GetProperties(BindingFlags.Instance | BindingFlags.Public)
您可以将其绑定到下拉列表,稍后再将其绑定到:
PropertyInfo property = typeof(YourClass).GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public)
property.SetValue(class, textBox.Text, null);
答案 4 :(得分:1)
在相关的说明中,如果用户需要一次更新大量属性,那么用户将讨厌此界面。您可以将属性划分为用户可以更快地移动的组或页面吗?
答案 5 :(得分:0)
此示例有用
public class aa
{
private string myVar;
public string value
{
get { return myVar; }
set { myVar = value; }
}
}
private void button1_Click(object sender, EventArgs e)
{
aa a1 = new aa();
System.Reflection.PropertyInfo pt = typeof(aa).GetProperty("value");
pt.SetValue(a1, "hi",null);
this.Text = a1.value;
}