使用反射来设置成员的价值

时间:2014-08-25 06:33:05

标签: c# reflection

我有一个DataGridView,每排有很多行包含两个单元格,  当cell[0]= namecell[1]= value对应于某个类中的成员时(也具有完全相同的名称)

我希望使用反射来使用DataGridView设置该类的属性 像这样 : 使用c# - How to iterate through classes fields and set properties

中的问题
GlobalParam.Params2 ParseDataGridForClass(System.Windows.Forms.DataGridView DataGrid)
{
    GlobalParam.Params2 NewSettings2 = new GlobalParam.Params2();
    foreach (System.Windows.Forms.DataGridViewRow item in DataGrid.Rows)
    {
        if (item.Cells[0].Value != null && item.Cells[1].Value != null)
        {
            Type T = NewSettings2.GetType();
            PropertyInfo info = T.GetProperty(item.Cells[0].Value.ToString());

                if (!info.CanWrite)
                continue;
            info.SetValue(NewSettings2,  
            item.Cells[1].Value.ToString(),null);
        }

    }
    return NewSettings2;
}

NewSettings看起来像

struct NewSettings 
{
    string a { get; set; }
    string b { get; set; }
    string c { get; set; }
}

迭代时我发现没有任何属性被改变 意味着NewSettings在所有属性中都保持为空

可能是什么问题?

1 个答案:

答案 0 :(得分:3)

首先,您提供的结构上的属性是私有的,因此结构上的GetProperty应该返回null,因为它将无法获取私有属性。其次,结构是值类型,而类是引用类型。这意味着您需要在引用类型中装入正在使用的结构,以保持其值。有关信息,请参阅附带的工作示属性是公开的,结构是盒装的。

struct NewSettings
{
    public string a { get; set; }
    string b { get; set; }
    string c { get; set; }
}

这是您设置属性的方式。

NewSettings ns = new NewSettings();
var obj = (object)ns;
PropertyInfo pi = ns.GetType().GetProperty("a");

pi.SetValue(obj, "123");

ns = (NewSettings)obj;