【问题标题】:VB.NET linq extension methods such as ToList not working with genericsVB.NET linq 扩展方法(例如 ToList)不适用于泛型
【发布时间】:2018-03-16 21:28:52
【问题描述】:

在 VB.NET 类文件中,我尝试使用 ToList() 等扩展方法,在这种情况下,泛型参数填充了我所知道的子类。

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

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

【问题讨论】:

    标签: vb.net linq


    【解决方案1】:

    您不使用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 的类型的项目都将被您的原始代码排除在外,但使用 OfType 包含在内。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 结果我需要强类型对象,所以我在 Where 调用之后调用了 Select(Function(x) DirectCast(x, specific))。这行得通,但我想知道是否有更短/更具表现力的方式来做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      相关资源
      最近更新 更多