VB.NET linq扩展方法,如ToList不能使用泛型

时间:2018-03-16 21:28:53

标签: vb.net linq

在VB.NET类文件中,我正在尝试使用诸如ToList()之类的扩展方法,其中泛型参数填充了我所知道的子类,在此上下文中。

Dim specificOrders = request.Orders _
.Where(Function(x) x.GetType().Equals(GetType(SpecificOrderType))) _
.ToList(Of SpecificOrderType)()

但是,我收到错误消息“扩展方法不通用或没有可用的类型参数”。关于为什么会这样的任何想法?
此方法应该在System.Linq命名空间中 - 我将其打开并在文件中引用。

2 个答案:

答案 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”类型对象。