Vb.net 获取访问器上的委托引发不兼容的类型错误

Vb.net 获取访问器上的委托引发不兼容的类型错误,vb.net,delegates,Vb.net,Delegates,我已经研究了一段时间,但似乎无法使它工作 有一个大的sql表(许多列、行),我必须在excel中获取值,我使用LINQ to sql获取每一行,使用反射按名称迭代每一列,并将其写入相应的excel列。看到反射很慢,我尝试将委托分配给每个属性,并(通过字典)将其映射到列名,以避免开销 问题是: 在VB.NET中,当我尝试将委托分配给属性的GetMethod(例如整数)时,如下所示: Dim prop = GetType(TestSQLClass).GetProperty("SomeColumn"

我已经研究了一段时间,但似乎无法使它工作

有一个大的sql表(许多列、行),我必须在excel中获取值,我使用LINQ to sql获取每一行,使用反射按名称迭代每一列,并将其写入相应的excel列。看到反射很慢,我尝试将委托分配给每个属性,并(通过字典)将其映射到列名,以避免开销

问题是: 在VB.NET中,当我尝试将委托分配给属性的GetMethod(例如整数)时,如下所示:

Dim prop  = GetType(TestSQLClass).GetProperty("SomeColumn")
Dim del As [Delegate] = [Delegate].CreateDelegate(GetType(Func(Of Integer)), prop.GetMethod)
我收到这个错误:

无法绑定到目标方法,因为其签名或安全性 透明度与委托类型的透明度不兼容


我遗漏了什么?

谢谢你的提问。我觉得有一个安瓦尔会很好,在C#找到了一个。请参阅模块底部的属性。我喜欢数据类型扩展的想法。它甚至出现在智能感知中。大约1500条记录,包含10列,大部分为文本,在3秒钟内完成

Imports Microsoft.Office.Interop
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Module DataTableToExcel
    ' Export DataTable into an excel file with field names in the header line
    ' - Save excel file without ever making it visible if filepath Is given
    ' - Don't save excel file, just make it visible if no filepath is given
    Private excelApp As Excel.Application
    Private workSheet As Excel.Worksheet
    <Extension>
    Public Sub ExportToExcel(tbl As DataTable, excelFilePath As String)
        Dim sw As New Stopwatch
        sw.Start()
        Try
            If IsNothing(tbl) OrElse tbl.Columns.Count = 0 Then
                Throw New Exception("ExportToExcel: Null or empty input table!")
            End If
            ' load excel, And create a New workbook
            excelApp = New Excel.Application()
            excelApp.Workbooks.Add()
            ' single worksheet
            workSheet = CType(excelApp.ActiveSheet, Excel.Worksheet)
            ' column headings
            For i = 0 To tbl.Columns.Count - 1
                workSheet.Cells(1, i + 1) = tbl.Columns(i).ColumnName
            Next
            Dim CellArray(tbl.Rows.Count - 1, tbl.Columns.Count - 1) As Object
            'rows
            For i = 0 To tbl.Rows.Count - 1
                'to do: Format DateTime values before printing
                For j = 0 To tbl.Columns.Count - 1
                    CellArray(i, j) = tbl.Rows(i)(j)
                Next
            Next
            workSheet.Range((workSheet.Cells(2, 1)), (workSheet.Cells(tbl.Rows.Count + 1, tbl.Columns.Count))).Value = CellArray
            ' check file path
            If Not String.IsNullOrEmpty(excelFilePath) Then
                Try
                    excelApp.DisplayAlerts = False
                    workSheet.SaveAs(excelFilePath)
                    MessageBox.Show("Excel file saved!")
                Catch ex As Exception
                    Throw New Exception("ExportToExcel: Excel file could not be saved! Check filepath." & ex.Message)
                End Try
            Else  ' no file path Is given
                excelApp.Visible = True
            End If
        Catch ex As Exception
            Throw New Exception("ExportToExcel:" & ex.Message)
        Finally
            excelApp.Workbooks.Close()
            excelApp.Quit()
            Marshal.ReleaseComObject(workSheet)
            Marshal.ReleaseComObject(excelApp.Workbooks)
            Marshal.ReleaseComObject(excelApp)
        End Try
        sw.Stop()
        Debug.Print(sw.ElapsedMilliseconds.ToString)
    End Sub
    'contributed by tuncalik; https://stackoverflow.com/questions/8207869/how-to-export-datatable-to-excel
    'speed improvement by Tomasz Wiśniewski
    'Releasing objects provided by  GrammatonCleric
End Module

Imports System.Data.SqlClient
Public Class TestDataTableToExcel
    Private dt As New DataTable
    Private Sub btnCreateExcelFile_Click(sender As Object, e As EventArgs) Handles btnCreateExcelFile.Click
        dt.ExportToExcel("Coffee.xlsx")
    End Sub

    Private Sub btnCreateDataTable_Click(sender As Object, e As EventArgs) Handles btnCreateDataTable.Click
        Using cn As New SqlConnection(My.Settings.CoffeeConnectionString)
            Using cmd As New SqlCommand("Select * From Coffees;", cn)
                cn.Open()
                Using dr As SqlDataReader = cmd.ExecuteReader
                    dt.Load(dr)
                End Using
            End Using
        End Using
    End Sub
End Class
导入Microsoft.Office.Interop
导入System.Runtime.CompilerServices
导入System.Runtime.InteropServices
模块DataTableToExcel
'将DataTable导出到一个excel文件中,标题行中有字段名
'-保存excel文件,如果给定了filepath,则不使其可见
“-不要保存excel文件,如果没有提供文件路径,只需使其可见即可
作为Excel.Application的私有excelApp
专用工作表格式为Excel。工作表
公共子ExportToExcel(tbl作为数据表,excelFilePath作为字符串)
将sw调暗为新秒表
sw.Start()
尝试
如果为Nothing(tbl)或LSE tbl.Columns.Count=0,则
抛出新异常(“ExportToExcel:Null或空输入表!”)
如果结束
'加载excel并创建新工作簿
excelApp=新建Excel.Application()
excelApp.Workbooks.Add()
“单一工作表
工作表=CType(excelApp.ActiveSheet,Excel.workSheet)
'列标题
对于i=0到tbl.Columns.Count-1
工作表.Cells(1,i+1)=tbl.Columns(i).ColumnName
下一个
将光线(tbl.Rows.Count-1、tbl.Columns.Count-1)作为对象
“行
对于i=0到tbl.Rows.Count-1
'要做的事情:打印前格式化日期时间值
对于j=0到tbl.Columns.Count-1
射线(i,j)=待测行(i)(j)
下一个
下一个
workSheet.Range((workSheet.Cells(2,1)),(workSheet.Cells(tbl.Rows.Count+1,tbl.Columns.Count)))。Value=0
'检查文件路径
如果不是String.IsNullOrEmpty(excelFilePath),则
尝试
excelApp.DisplayAlerts=False
工作表.另存为(excelFilePath)
MessageBox.Show(“Excel文件已保存!”)
特例
引发新异常(“ExportToExcel:Excel文件无法保存!请检查文件路径。”&ex.Message)
结束尝试
Else'没有给出文件路径
excelApp.Visible=True
如果结束
特例
抛出新异常(“ExportToExcel:&ex.Message”)
最后
excelApp.Workbooks.Close()的
excelApp.Quit()
Marshal.ReleaseComObject(工作表)
Marshal.ReleaseComObject(Excel应用程序工作簿)
Marshal.ReleaseComObject(excelApp)
结束尝试
sw.Stop()
Debug.Print(sw.elapsedmillesons.ToString)
端接头
"通卡利克贡献,;https://stackoverflow.com/questions/8207869/how-to-export-datatable-to-excel
“托马斯维尼夫斯基的速度提升”
“释放牧师提供的物品
端模块
导入System.Data.SqlClient
公共类TestDataTableToExcel
私有dt作为新数据表
私有子btnCreateExcelFile_Click(发件人作为对象,e作为事件参数)处理btnCreateExcelFile。单击
dt.ExportToExcel(“Coffee.xlsx”)
端接头
私有子btnCreateDataTable\单击(发送者作为对象,e作为事件参数)处理btnCreateDataTable。单击
将cn用作新的SqlConnection(My.Settings.CoffeeConnectionString)
使用cmd作为新的SqlCommand(“从咖啡中选择*”,cn)
cn.Open()
使用dr作为SqlDataReader=cmd.ExecuteReader
dt.负载(dr)
终端使用
终端使用
终端使用
端接头
末级

哦,对不起,忘了提一下,我正试图在Linq to SQL中执行此操作。它是一个自动生成的类,包含表中的每一列。我试图为类中每个属性的get访问器分配一个委托,以避免反射的GetProperty()太糟糕。Linq位于ADO.net之上,所以它的速度一定要慢一点。使用datareader和datatable,您可以获得excel文件的标题和所有数据。谢谢!!他是个救命恩人!我在尝试将方法参数类型作为delgate类型传递时遇到了困难,因此如果它是Int32属性,我将使用CreateDelegate(GetType(Func(Int32))创建委托,该委托适用于常规方法,但不适用于GetMethod Of properties。诀窍是传递类类型,就像这个CreateDelegate(GetType(Func))一样(属于第32类)