使用反射来设置成员的值
本文关键字:成员 设置 反射 | 更新日期: 2023-09-27 18:19:15
我有一个DataGridView
有许多行,每行包含两个单元格,当cell[0]= name
和cell[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;