我的所有数据对象都实现了IFillable接口
Public Interface IFillable
Sub Fill(ByVal Datareader As Data.IDataReader)
End Interface
在对象本身中,您通常会看到类似
的内容Public Class Supplier
Implements IFillable
Public Sub New()
End Sub
Public Sub New(ByVal SupplierID As Guid, ByVal CompanyID As Guid, ByVal Description As String)
Me._SupplierID = SupplierID
Me._CompanyID = CompanyID
Me._Description = Description
End Sub
Public Property SupplierID As Guid
Public Property CompanyID As Guid
Public Property Description As String
Public Sub Fill(ByVal Datareader As System.Data.IDataReader) Implements IFillable.Fill
If Not Datareader.IsClosed Then
Me._SupplierID = Datareader.GetGuid(Datareader.GetOrdinal("SupplierID"))
Me._CompanyID = Datareader.GetGuid(Datareader.GetOrdinal("CompanyID"))
Me._Description = Datareader.GetString(Datareader.GetOrdinal("Description"))
End If
End Sub
End Class
现在这里是棘手的一点。鉴于我的所有属性名称 将始终 匹配我的数据库列名称,我想要做的是使用反射在编译时生成填充方法并推断类型和列名称datareader。
我假设我需要将此功能构建为某种工具/ vs插件?我正在寻找的是关于最好的方法的指导。
PS:顺便说一句:显然我可以在运行时使用反射来轻松做到这一点,但我不想为它带来性能损失(虽然理论上如果我能以某种方式缓存值(静态类?)它可能不会太糟糕)答案 0 :(得分:1)
为什么不在'before-build'步骤中使用简单的生成器来创建代码。
我们创建了自己的代码生成器,在数据库定义更改后手动触发时生成代码数据层。
答案 1 :(得分:0)
我建议使用一些代码生成框架。 对于VB / C#/ .NET,最明显的选择应该是T4: some T4 introduction
答案 2 :(得分:0)
您可以查看C#的“aspect-oriented programming”系统,其中一些系统在编译时工作,例如
PostSharp将.NET二进制模块读取到 一个对象模型,让插件分析 并转换它,然后写回来 到MSIL。
有一个列表here,我从来没有在项目中使用过任何一个项目但是已经考虑过像你这样的问题。
源代码生成框架也是一个很好的选择,可以更容易理解正在发生的事情。