【发布时间】:2020-10-20 00:35:52
【问题描述】:
我在访问我创建的将带有基类的对象作为其类型参数的扩展方法时遇到问题。
这是基类:
Namespace Models.Db
Public Class Base
Public Property Id As Integer
End Class
End Namespace
...和子类:
Namespace Models.Db
Public Class City
Inherits Base
...
End Class
End Namespace
扩展方法如下:
Imports System.Collections.Generic
Imports System.Data.Entity
Imports System.Linq
Imports System.Runtime.CompilerServices
Imports Matrix.Models
Imports Moq
Public Module Extensions
<Extension>
Public Sub SetupMock(Instance As Mock(Of DbSet(Of Db.Base)), Entities As List(Of Db.Base))
Instance.As(Of IQueryable(Of Db.Base)).Setup(Function(Cities) Cities.GetEnumerator).Returns(Entities.GetEnumerator)
Instance.As(Of IQueryable(Of Db.Base)).Setup(Function(Cities) Cities.ElementType).Returns(Entities.AsQueryable.ElementType)
Instance.As(Of IQueryable(Of Db.Base)).Setup(Function(Cities) Cities.Expression).Returns(Entities.AsQueryable.Expression)
Instance.As(Of IQueryable(Of Db.Base)).Setup(Function(Cities) Cities.Provider).Returns(Entities.AsQueryable.Provider)
End Sub
End Module
...这是调用代码:
Private Function GetDbContextMock() As Mock(Of Db.Context)
Dim oCitiesMock As Mock(Of DbSet(Of Db.City))
oCitiesMock = New Mock(Of DbSet(Of Db.City))
oCitiesMock.SetupMock(Me.Cities) ' Me.Cities is a List(Of Db.City)
End Function
编译时错误是:
“SetupMock”不是“Mock(Of DbSet(Of City))”的成员
但是,当我将调用代码更改为:
Dim oCitiesMock As Mock(Of DbSet(Of Db.Base))
oCitiesMock = New Mock(Of DbSet(Of Db.Base))
...找到扩展方法。但我需要发送扩展方法的子类引用,而不是基类引用。
This answer 表示可以使用简单的超类/子类对象,但由于这是处理类型参数,所以有点复杂。
This answer 起初似乎可以提供一个解决方案,但经过进一步思考,它只解决了一个级别的类型参数。上面的代码有两个。我不确定这种细微差别是否会产生影响,但最终代码无法编译。
这可以在 .NET 中完成吗?
【问题讨论】:
标签: vb.net inheritance extension-methods type-parameter