在C#2005中动态获取/设置对象的属性

时间:2009-02-10 04:10:13

标签: c# reflection

我继承了一个代码库,我正在编写一个小工具来为它更新数据库。该代码使用像SubSonic这样的数据访问层(但它是本土的)。对象有很多属性,比如“id”,“templateFROM”和“templateTO”,但有50个属性。

在屏幕上,我无法在自己的文本框中显示所有50个属性以进行数据输入,因此我有一个包含所有可能属性的列表框,以及一个用于编辑的文本框。当他们在列表框中选择一个属性时,我在文本框中填入属性对应的值。然后我需要在完成编辑后更新属性。

现在我正在使用2个巨大的switch case语句。这对我来说似乎很愚蠢。有没有办法动态告诉C#我想要设置或获取的属性?也许像:

entObj."templateFROM" = _sVal;

...

6 个答案:

答案 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;
    }