【发布时间】:2015-01-14 20:10:50
【问题描述】:
我得到了一个库,其中包含通用数据对象、项目、表、行和字段。在我的程序中,我有一个名为 Building 的项目,它的表 1 包含“单位”,表 1 的字段 1 是“单位名称”。所以我所做的是......
Public Class Unit
Private myRow As Row
Public Sub New(ByRef R as Row)
myRow = Row
End Sub
Public Function Unitname() as String
Return myRow.Fields(1)
End Function
... etc ...
End Class
看起来还不错吧?但是我没有加载单元对象,我有行。那我也得另开一门课了……
Public Class Building
Private myProj as Project
...
Public Function Units() As List(Of Unit)
Dim ans as New List(Of Unit)
For Each R In myProj.Tables(1).Rows
ans.Add(new Unit(R))
Next
Return ans
' or I could use myProj.Tables(1).Rows.ConvertTo(Of Unit)
End Function
...etc...
当然,我必须创建建筑物列表,这样我才能访问单元列表,以及其他几十个列表和访问器,变成数千行代码,其唯一目的是制作一组对象指向另一个。
它有效,而且我知道送货是一项功能。但我真正想做的是制作一个看起来像......
Public Class Unit
Inherits Row
...
End Class
然后我会将 List(Of Row) “反向转换”为 List(Of Unit)。这不仅会消除大量代码,还会消除悬空指针,大量减少内存,并消除可能需要一些时间的设置集。理论上可能,除了代码没有区别,但我没有看到在 VB.Net 中这样做的方法。
在 Obj-C 中,这被称为 swizzling(和/或扩展),我认为 Java 也有类似的概念。我怀疑 ADO.Net 必须做这样的事情?我缺少某种“将其包装在其中”的功能吗?
【问题讨论】:
-
如果这些是数据集,您是否考虑过使用强类型数据集?
-
这些不是DataSet,都是一堆读取文本文件的代码。
标签: vb.net casting isa-swizzling