我有一个DataGridView
,每排有很多行包含两个单元格,
当cell[0]= name
和cell[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在所有属性中都保持为空
可能是什么问题?
答案 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;