我一直在使用以下代码使用 Relection 设置类属性
MyClasss c = new MyClass(id);
prop = c.GetType().GetProperty(field);
prop.SetValue(c, Convert.ChangeType(value, prop.PropertyType), null);
该值取自 DataGridView 并由 CellEndEdit 事件触发,因此用户输入的值可以是大量属性和类型中的任何一种。
有时 Convert.ChangeType 可以成功运行,但有时我会收到 Invalid Cast 错误。
例如,如果属性类型是 (decimal?) [a nullable decimal],我会收到错误消息。
[编辑]
作为我所做工作的更多背景知识,DataGridView 包含有关用户最近对 SQL Server 中的数据所做的更改的信息。它包含更改列表,显示表格、字段、新值和旧值以及更改人员和时间的详细信息。如果经理不同意其中一项更改,则可以选择恢复。因此,当从列表中选择一个项目时,我的代码需要查找相应的表和字段,并将当前值设置回存储的旧值。它是客户特别希望作为 DataGrid 的审计控制工具。
问题是由于数据网格上显示的字段数量,数据类型可以是任何类型,并且直到运行时才知道。老实说,我不知道如何在这些情况下使用 DataBinding,但如果有人仍然认为这是比反射更好的选择,他们可能会为我指明正确的方向。