使用反射来设置成员的值

本文关键字:成员 设置 反射 | 更新日期: 2023-09-27 18:19:15

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

,我想使用反射来设置该类的属性使用DataGridView像这样:如何遍历类字段和设置属性

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在它的所有属性中保持为空

使用反射来设置成员的值

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

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;