VB.NET中的扩展方法出错

时间:2012-03-26 11:23:02

标签: asp.net vb.net extension-methods

我正在尝试在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

1 个答案:

答案 0 :(得分:1)

  1. 您的代码有效,因此必须在其他地方引发异常(survey是什么?)。
  2. 使用collection.Cast(Of ListItem)()代替collection.OfType(Of ListItem)(),因为ListItemCollection中的所有对象本质上都属于ListItem类型。
  3. 使用

    进行测试
    <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
    
相关问题