Ошибка с методом расширения в VB.NET - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь написать методы расширения в 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

Но я получаю эту ошибку.

Класс 'System.Web.UI.WebControls.ListItem'не может быть проиндексирован, потому что у него нет свойства по умолчанию

Что может быть не так?

Я называю код следующим образом.

ddlSalesmanager.Items.FindByText(survey, StringComparison.CurrentCultureIgnoreCase)

PS: Iпортировал этот замечательный код с C # на VB

1 Ответ

1 голос
/ 26 марта 2012
  1. Ваш код работает, поэтому исключение должно быть вызвано где-то еще (что такое survey?).
  2. Используйте 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
...