我正在尝试在VB.NET中编写扩展方法
Imports System.Runtime.CompilerServices
Module ExtensionMethods
<Extension()> _
Public Function FindByText(ByVal collection As ListItemCollection, text As String, comparisonType As StringComparison) As ListItem
Dim result As ListItem = collection.OfType(Of ListItem)().FirstOrDefault(Function(s) s.Text.Equals(text, comparisonType))
Return result
End Function
<Extension()> _
Public Function FindByValue(ByVal collection As ListItemCollection, text As String, comparisonType As StringComparison) As ListItem
Dim result As ListItem = collection.OfType(Of ListItem)().FirstOrDefault(Function(s) s.Value.Equals(text, comparisonType))
Return result
End Function
End Module
但我收到了这个错误。
Class&#39; System.Web.UI.WebControls.ListItem&#39;无法编入索引,因为 它没有默认属性
可能出现什么问题?
我正在调用这样的代码。
ddlSalesmanager.Items.FindByText(survey, StringComparison.CurrentCultureIgnoreCase)
P.S:我将this wonderful code from C#移植到VB
答案 0 :(得分:1)
survey
是什么?)。collection.Cast(Of ListItem)()
代替collection.OfType(Of ListItem)()
,因为ListItemCollection
中的所有对象本质上都属于ListItem
类型。使用
进行测试<asp:DropDownList ID="DdlFoo" runat="server" AutoPostBack="true" OnSelectedIndexChanged="FooSelected" >
<asp:ListItem Text="Foo1" Value="1"></asp:ListItem>
<asp:ListItem Text="Foo2" Value="2"></asp:ListItem>
<asp:ListItem Text="Foo3" Value="3"></asp:ListItem>
</asp:DropDownList>
在SelectedIndexChanged
事件处理程序中:
Dim foo2 = DirectCast(sender, DropDownList).Items.FindByText("FOO2", StringComparison.CurrentCultureIgnoreCase)
If Not foo2 Is Nothing Then
' your overloaded extension is called successfully
End If