在VB.NET类文件中,我正在尝试使用诸如ToList()之类的扩展方法,其中泛型参数填充了我所知道的子类,在此上下文中。
Dim specificOrders = request.Orders _
.Where(Function(x) x.GetType().Equals(GetType(SpecificOrderType))) _
.ToList(Of SpecificOrderType)()
但是,我收到错误消息“扩展方法不通用或没有可用的类型参数”。关于为什么会这样的任何想法?
此方法应该在System.Linq命名空间中 - 我将其打开并在文件中引用。
答案 0 :(得分:3)
您不能使用Where
按类型进行过滤。这就是OfType
方法的用途。它过滤和演员:
Dim specificOrders = request.Orders.
OfType(Of SpecificOrderType)().
ToList()
在这种情况下,OfType
会返回IEnumerable(Of SpecificOrderType)
并在其上调用ToList
会返回List(Of SpecificOrderType)
。这就是ToList
的工作原理。它只是创建一个List(Of T)
,其通用类型与它所要求的IEnumerable(Of T)
相同。
如果您要使用Where
,则可以使用Cast
从基本类型转到SpecificOrderType
:
Dim specificOrders = request.Orders.
Where(Function(x) x.GetType().Equals(GetType(SpecificOrderType))).
Cast(Of SpecificOrderType)().
ToList()
关于OfType
的一点要注意的是,它将匹配任何可以作为指定类型转换的项目。这通常是您想要的,也可能是原始代码产生的结果,但值得注意的是,任何继承SpecificOrderType
类型的项目都会被原始代码排除,但包含在{ {1}}。
答案 1 :(得分:0)
ToList()
不能有类型参数,因为该方法不是通用的。
所以只需使用ToList()
Dim suborders = orders _
.Where(Function(x) x.GetType().Equals(GetType(nonspecificOrder))) _
.ToList()
尝试以下示例。
'Order class
Public Class order
End Class
'specificOrder class
Public Class specificOrder
Inherits order
End Class
'nonspecificOrder class
Public Class nonspecificOrder
Inherits order
End Class
用法:
Dim orders As List(Of order) = New List(Of [order])
Dim s1 As specificOrder = New specificOrder()
Dim s2 As specificOrder = New specificOrder()
Dim s3 As specificOrder = New specificOrder()
Dim s4 As specificOrder = New specificOrder()
Dim s5 As nonspecificOrder = New nonspecificOrder()
Dim s6 As nonspecificOrder = New nonspecificOrder()
orders.Add(DirectCast(s1, order))
orders.Add(DirectCast(s2, order))
orders.Add(DirectCast(s3, order))
orders.Add(DirectCast(s4, order))
orders.Add(DirectCast(s5, order))
orders.Add(DirectCast(s6, order))
Dim suborders = orders _
.Where(Function(x) x.GetType().Equals(GetType(nonspecificOrder))) _
.ToList()
现在返回两个“nonspecificOrder”类型对象。