【发布时间】:2013-11-13 05:45:57
【问题描述】:
我一直在使用以下代码来使用 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 错误。
例如,如果属性类型是(十进制?)[可以为空的十进制],我会收到错误。
[编辑]
作为我所做工作的更多背景知识,DataGridView 包含有关用户最近对 SQL Server 中的数据所做的更改的信息。它包含更改列表,显示表、字段、新值和旧值以及更改人员和时间的详细信息。如果经理不同意其中一项更改,则可以选择恢复。因此,当从列表中选择一个项目时,我的代码需要查找相应的表和字段,并将当前值设置回存储的旧值。这是客户特别希望作为 DataGrid 的审计控制工具。
问题是由于数据网格上显示的字段数量,数据类型可以是任何类型,并且直到运行时才知道。老实说,我不知道在这种情况下如何使用 DataBinding,但如果有人仍然认为这是比反射更好的选择,他们或许可以为我指明正确的方向。
【问题讨论】:
-
为什么不使用数据绑定?这就是它的目的。您编写的代码是重新发明轮子。
-
输入实际上来自一个DataGridView,它显示了来自许多不同表的数据,并且它涵盖了许多属性和类型。我不确定在这种情况下如何使用 DataBinding。
-
所以你的问题可以分解为
Convert.ChangeType("12", typeof(decimal?))? -
我确定,数据绑定正是为了这些目的而创建的。
-
处理可空值有点不同,请参阅stackoverflow.com/questions/3531318/…
标签: c#