【问题标题】:Invalid Cast when using Reflection SetValue使用反射 SetValue 时强制转换无效
【发布时间】: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#


【解决方案1】:

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

见:Convert.ChangeType

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多