c# - .Net 编译器 Hook

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

我所有的数据对象都实现了一个 IFillable 接口(interface)

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

现在这是棘手的一点。鉴于我所有的属性名称WILL ALWAYS 匹配我的数据库列名我想做的是使用反射在编译时生成填充方法并推断类型和列名数据读取器。

我假设我需要将此功能构建为某种工具/vs 插件?我正在寻找的是有关解决此问题的最佳方法的指导。

PS:顺便说一句:显然我可以在运行时使用反射轻松地做到这一点,但我不想为此而受到性能影响(尽管理论上如果我能以某种方式缓存值(静态类?)它可能不会太糟糕) .

最佳答案

为什么不在“构建前”步骤中使用简单的生成器来创建代码。

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

关于c# - .Net 编译器 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4732500/

相关文章:

c# - 如何在现有的完全空的 .xml 文件中写入内容?

c# - 适用于 Windows x64 上大文件的良好 ISAM 库或其他简单文件管理器

.net - 可变间隔定时器

vb.net - backgroundWorker仅在取消时更新进度

mysql - 获取sql后检索DataRow

c# - 如何防止对文本框的SQL注入(inject)攻击?

C# excel - 仅提取列范围内的行

c# - 如何在 C# 中将 byte[] 分配为指针

c# - 当另一个对象的属性发生更改时通知一个对象

c# - UWP 中的键盘快捷键