【问题标题】:Changing data type of field in .net更改.net中字段的数据类型
【发布时间】:2013-12-09 09:48:54
【问题描述】:

是否可以通过反射或其他方式更改.net中字段/属性的数据类型?

我正在寻找此功能,因为强类型数据集中存在问题。强类型数据集不能灵活地更改可为空类型的数据类型。请参阅相关链接here。因此,如果有可能在运行时更改数据类型,则可以消除此问题。另外,添加;按照这个MSDN Link; Microsoft 团队不太热衷于提供这种支持。

【问题讨论】:

  • 如果您不知道列的类型,您可能不应该使用强类型数据集。
  • 我不知道你是否可以使用dynamic,但人们有充分的理由只在必要时使用它。
  • @MikeChristensen 我知道数据类型,但不幸的是,当我尝试迭代数据表时,我得到了错误,因为 VS 的数据集设计器具有 Throw Exception 的唯一属性。
  • @MikeChristensen 只有当数据类型应该从数据库中获取空值并且它们无法将它们转换为 int、double、float 等时才会出现此问题。
  • @shankbond - 优雅的解决方案是不要使用像类型化数据集这样的过时框架。它们受到当时 CLR 的限制。如今,有 高级 ORM,例如 Entity Framework 或 NHibernate。

标签: c# .net reflection strongly-typed-dataset


【解决方案1】:

首先,这不是错误;这是由于 dbnull (即未知值)和 null (即无处指向的引用)之间的差异。从 Connect 和其他地方的一些不透明和无益的反应来看,微软自己似乎不善于解释这一事实使情况更加复杂。

这个问题有多种解决方案,具体取决于您要达到的目标。如果您正在使用数据绑定,那么绑定机制主要为您透明地处理它;如果您直接在代码中访问数据集,则设计器将构建 Isxxxnull / setxxxnull 方法供您在使用之前检查值。最后,您可以将数据类型更改为 system.object,或者您可以根据需要在设计器中改写 NullValue 以输入另一个值,只要该值对数据类型有效 - 例如,对于 int 为 0 或 -1。

【讨论】:

    【解决方案2】:

    我不知道。类型信息和绑定在编译类型中确定,因此无法在运行时更改它。

    用于更改输入的一种模式是adapter pattern。这可以只传递所有其他字段,然后将相关字段“转换”为新类型。当然,这也发生在编译时。

    如果您进一步扩展您正在尝试做的事情,可能会有更好的选择。

    【讨论】:

      【解决方案3】:

      Datasets 相当过时,源于 .net v1.0。微软永远不会对它们进行更改或添加。一般来说,更好的方法是强类型 POCO。您甚至可以创建多个使用相同后备存储(对象类型)的强类型属性。在访问相应的属性之前,您需要测试正确的类型。

      【讨论】:

      • 感谢您的回复,创建这些基于 POCO 的模型并使用 ADO.net 填充它们需要花费大量时间。正是因为这个原因,我去了数据集,但现在我被卡住了:(
      • Linq to SQL 和 EF 都会为您创建 POCO 或类似 POCO 的位。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多