.Net编译钩子

时间:2011-01-19 06:52:40

标签: c# .net vb.net reflection compiler-construction

我的所有数据对象都实现了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:顺便说一句:显然我可以在运行时使用反射来轻松做到这一点,但我不想为它带来性能损失(虽然理论上如果我能以某种方式缓存值(静态类?)它可能不会太糟糕)

3 个答案:

答案 0 :(得分:1)

为什么不在'before-build'步骤中使用简单的生成器来创建代码。

我们创建了自己的代码生成器,在数据库定义更改后手动触发时生成代码数据层。

答案 1 :(得分:0)

我建议使用一些代码生成框架。 对于VB / C#/ .NET,最明显的选择应该是T4: some T4 introduction

答案 2 :(得分:0)

您可以查看C#的“aspect-oriented programming”系统,其中一些系统在编译时工作,例如

  

PostSharp将.NET二进制模块读取到   一个对象模型,让插件分析   并转换它,然后写回来   到MSIL。

有一个列表here,我从来没有在项目中使用过任何一个项目但是已经考虑过像你这样的问题。

源代码生成框架也是一个很好的选择,可以更容易理解正在发生的事情。