无法将类型 'VB$StateMachine_4_GetAllFrontPageBanners' 的对象转换为类型 IEnumerable(FrontPageBanner)
Unable to cast object of type 'VB$StateMachine_4_GetAllFrontPageBanners' to type IEnumerable(Of FrontPageBanner)
我不太习惯使用 VB.NET,但我遇到了谷歌搜索无法解决问题的错误。我创建了这个数据访问 class,它有一个使用 Yield
和 vb.net 的对象初始化快捷方式
的方法
Public Class FMACMarketingRepository
Private cvConnection As SqlConnection
Private cvCommand As SqlCommand
Private cvReader As SqlDataReader
Public Sub New(Role As InfotelLibrary.Data.DatabaseRole)
cvConnection = New SqlConnection(InfotelLibrary.Data.ConnectionString(Role, InfotelLibrary.Data.DatabaseName.Mongoose))
End Sub
Public Iterator Function GetAllFrontPageBanners() As IEnumerable(Of FrontPageBanner)
Using dbConnection As IDbConnection = cvConnection
Using cmd As IDbCommand = dbConnection.CreateCommand()
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sel_AllFmacFrontPageBanners"
Using reader As IDataReader = cmd.ExecuteReader()
If reader Is Nothing Then
Yield Nothing
End If
While reader.Read()
Yield New FrontPageBanner() With
{
.Banner_Id = CType(reader("Banner_ID"), Integer),
.Geo_Id = CType(reader("Geo_ID"), Long),
.Title = CType(reader("Title"), String),
.Description = CType(reader("Description"), String),
.Link = CType(reader("Link"), String),
.Image = CType(reader("Image"), Byte()),
.SpecialOffer = CType(reader("Special_Offer"), Boolean)
}
End While
End Using
End Using
End Using
End Function
End Class
Intellisense 中有 0 个错误,它可以构建,但是当我 运行 网页时出现错误
System.InvalidCastException: Unable to cast object of type 'VB$StateMachine_4_GetAllFrontPageBanners' to type 'System.Collections.Generic.List`1[InfotelData.Mongoose.Data.FrontPageBanner]'.
Line 7:
Line 8: Protected Sub Page_Load(ByVal sender As Object, e As EventArgs) Handles Me.Load
Line 9: Dim banners As List(Of FrontPageBanner) = cvRepo.GetAllFrontPageBanners()
Line 10: If banners.Count() > 0 Then
Line 11: rptUploadedBanners.DataSource = banners
调试在遇到 page_load 时给出相同的错误。
我明显感觉到用户错误是罪魁祸首。
GetAllFrontPageBanners
returns 一个 IEnumerable(Of FrontPageBanner)
(*) 而你正在尝试将其存储在 List(Of FrontPageBanner)
中。我很惊讶它没有给出编译时错误(你可能处于 Option Strict Off 模式)
您需要使用 .ToList 从可枚举列表中创建一个列表,例如:
Dim banners As List(Of FrontBanner) = cvRepo.GetAllFrontPageBanners.ToList
(*) 在内部迭代器块将函数转换为生成的"class-state-machine"(在您的案例中实现 IEnumerable(Of FrontBanner))。
这是您得到的奇怪名称,但您可以(并且应该)将其视为源代码中给出的 return 类型。
关于 here
的更多信息
我不太习惯使用 VB.NET,但我遇到了谷歌搜索无法解决问题的错误。我创建了这个数据访问 class,它有一个使用 Yield
和 vb.net 的对象初始化快捷方式
Public Class FMACMarketingRepository
Private cvConnection As SqlConnection
Private cvCommand As SqlCommand
Private cvReader As SqlDataReader
Public Sub New(Role As InfotelLibrary.Data.DatabaseRole)
cvConnection = New SqlConnection(InfotelLibrary.Data.ConnectionString(Role, InfotelLibrary.Data.DatabaseName.Mongoose))
End Sub
Public Iterator Function GetAllFrontPageBanners() As IEnumerable(Of FrontPageBanner)
Using dbConnection As IDbConnection = cvConnection
Using cmd As IDbCommand = dbConnection.CreateCommand()
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sel_AllFmacFrontPageBanners"
Using reader As IDataReader = cmd.ExecuteReader()
If reader Is Nothing Then
Yield Nothing
End If
While reader.Read()
Yield New FrontPageBanner() With
{
.Banner_Id = CType(reader("Banner_ID"), Integer),
.Geo_Id = CType(reader("Geo_ID"), Long),
.Title = CType(reader("Title"), String),
.Description = CType(reader("Description"), String),
.Link = CType(reader("Link"), String),
.Image = CType(reader("Image"), Byte()),
.SpecialOffer = CType(reader("Special_Offer"), Boolean)
}
End While
End Using
End Using
End Using
End Function
End Class
Intellisense 中有 0 个错误,它可以构建,但是当我 运行 网页时出现错误
System.InvalidCastException: Unable to cast object of type 'VB$StateMachine_4_GetAllFrontPageBanners' to type 'System.Collections.Generic.List`1[InfotelData.Mongoose.Data.FrontPageBanner]'.
Line 7:
Line 8: Protected Sub Page_Load(ByVal sender As Object, e As EventArgs) Handles Me.Load
Line 9: Dim banners As List(Of FrontPageBanner) = cvRepo.GetAllFrontPageBanners()
Line 10: If banners.Count() > 0 Then
Line 11: rptUploadedBanners.DataSource = banners
调试在遇到 page_load 时给出相同的错误。
我明显感觉到用户错误是罪魁祸首。
GetAllFrontPageBanners
returns 一个 IEnumerable(Of FrontPageBanner)
(*) 而你正在尝试将其存储在 List(Of FrontPageBanner)
中。我很惊讶它没有给出编译时错误(你可能处于 Option Strict Off 模式)
您需要使用 .ToList 从可枚举列表中创建一个列表,例如:
Dim banners As List(Of FrontBanner) = cvRepo.GetAllFrontPageBanners.ToList
(*) 在内部迭代器块将函数转换为生成的"class-state-machine"(在您的案例中实现 IEnumerable(Of FrontBanner))。
这是您得到的奇怪名称,但您可以(并且应该)将其视为源代码中给出的 return 类型。
关于 here