0

我一直在使用以下代码使用 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,但如果有人仍然认为这是比反射更好的选择,他们可能会为我指明正确的方向。

4

1 回答 1

2

value接受的类型必须Convert.ChangeType实现IConvertible。很明显,您正在转换任意类型,对于那些不实现接口的类型,您将得到无效的强制转换异常。

请参阅:Convert.ChangeType

于 2013-11-13T06:48:31.107 回答