。什么方法没有在泛型类型列表上定义?

时间:2016-09-12 11:53:25

标签: vb.net generics

当我尝试在列表中使用.Where()方法时,如果列表是泛型类型,则似乎不会定义此方法:

在我的程序中,我有一个名为Warning的类,在另一个类中,有一个警告列表,定义为:

Dim warningList As List(Of Warning)

当我尝试将此列表操作为:

Dim item = warningList.Where(Function(x) x.GetName() = "Foo").FirstOrDefault()

这完全正常,但是当我这样尝试时:

Dim itemList
if(type = "Warning") Then 'Please note that this condition is true...
    itemList = warningList
End If

Dim item = itemList.Where(Function(x) x.GetName() = "Foo").FirstOrDefault()

我收到异常,说明没有为类.Where()定义方法Warning

有人可以告诉我为什么会这样吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

现在你已经编辑了你的问题,但很清楚。

声明 define('BASEPATH', realpath($_SERVER["DOCUMENT_ROOT"]) .'admin/system/'); include(realpath($_SERVER["DOCUMENT_ROOT"]) . '/admin/system/libraries/Language.php'); echo 'line' . line('servicios'); exit; 没有类型,所以它itemList隐式地(在VB.NET中,选项严格设置为Object我强烈推荐反对)。

现在您已声明了Object类型的变量,您可以为其指定任何类型。但是你必须将它强制转换为它的真实类型Off才能使用list或LINQ方法(扩展List(Of Warning)

但是用正确的类型声明它:

IEnumerable(Of T)

包括评论解释为什么Dim itemList As List(Of Warning) if(type = "Warning") Then itemList = warningList End If Dim item = itemList.Where(Function(x) x.GetName() = "Foo").FirstOrDefault() 与此问题无关:

  

那不是真正的代码。如果Warning真的是warningList   你应该可以使用List(Of Warning)(如果LINQ是   进口)。您将此实例分配给另一个变量的事实   (在声明时)不会因为变量的类型而改变任何东西   也是Enumerable.Where。所以List(Of Warning)也应该有效。 itemList.Where   与它无关,因为Warning扩展的类型   是WhereIEnumerable(Of T)可以是任何类型(甚至是T)。自Object以来   实现List(Of T)您可以在任何列表中使用IEnumerable(Of T)   (或数组)。

如果你实际上有多种类型而且Enumerable.Where只是其中之一,那么你应该实现一个通用接口。这是一个例子:

Warning

现在你可以声明一个Public Enum NotificationType Warning Info [Error] End Enum Public Interface INamedNotification ReadOnly Property Type As NotificationType Property Name As string End Interface Public Class Warning Implements INamedNotification Public Sub New( name As String ) Me.Name = name End Sub Public Property Name As String Implements INamedNotification.Name Public ReadOnly Property Type As NotificationType Implements INamedNotification.Type Get Return NotificationType.Warning End Get End Property End Class 并用任何实现这个接口的方法填充它,比如List(Of INamedNotification)类:

Warning