当我尝试在列表中使用.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
有人可以告诉我为什么会这样吗? 谢谢!
答案 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
扩展的类型 是Where
,IEnumerable(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