Какую ошибку я делаю при создании ограничения в дженериках? - PullRequest
0 голосов
/ 26 января 2010

В asp.net 2.0 у меня есть несколько «выпадающих списков», определенных с помощью обобщений (например, цвет глаз, цвет волос и т.д.). Поля все типичные; id, text и т. д. Все они определены как свои собственные классы, которые должны реализовывать созданный мной интерфейс под названием ILookup. Однако, когда я пытаюсь вернуть List <> этого класса, используя:

ddlEyeColor.DataSource = luMgt.GetLookUpItemList(Of EyeColor)()

, который вызывает слой BC:

  Public Function GetLookUpItemList(Of t As {ILookup, New})() As List(Of t)
    Dim luMgt As New LookupMgt
    Return luMgt.GetLookUpItemList(Of t)()
End Function

Что вызывает уровень DBC, который, отчасти, является ....

    Public Function GetLookUpItemList(Of t As {ILookup, New})() As List(Of t)

    Dim lstGenericList As New List(Of t)
    'rest of code to populate the list here
    end function

сообщение об ошибке утверждает, что EyeColor не реализует ILookup.

Ошибка 21 Тип аргумента 'EyeColor' не наследует и не реализует тип ограничения 'ILookup'.

Но вот начало класса EyeColor ....

Public Class EyeColor
Implements ILookup

Вот полный интерфейс ....

Открытый интерфейс ILookup

Property ID() As Int32
Property Text() As String
Property Description() As String
Property Status() As Status
Property OrderID() As Int32
ReadOnly Property LookUpType() As LookUpType

Конечный интерфейс

И здесь, в классе EyeColor, я реализую свойства интерфейса

Public Overrides Property Description() As String Implements ILookup.Description
    Get
        Return MyBase.Description
    End Get
    Set(ByVal value As String)
        MyBase.Description = value
    End Set
End Property

Public Overrides Property ID() As Integer Implements ILookup.ID
    Get
        Return MyBase.ID
    End Get
    Set(ByVal value As Integer)
        MyBase.ID = value
    End Set
End Property

Public Overrides Property OrderID() As Integer Implements ILookup.OrderID
    Get
        Return MyBase.OrderID
    End Get
    Set(ByVal value As Integer)
        MyBase.OrderID = value
    End Set
End Property

Public Overrides Property Status() As Status Implements ILookup.Status
    Get
        Return MyBase.Status
    End Get
    Set(ByVal value As Status)
        MyBase.Status = value
    End Set
End Property

Public Property EyeColor() As String Implements ILookup.Text
    Get
        Return _eyeColor
    End Get
    Set(ByVal value As String)
        _eyeColor = value
    End Set
End Property

Public ReadOnly Property LookUpType() As LookUpType Implements ILookup.LookUpType
    Get
        Return BE.LookUpType.EyeColor
    End Get
End Property

Ответы [ 2 ]

0 голосов
/ 27 января 2010

Я думаю, вам нужно изменить подпись вашего метода на:

Public Function GetLookUpItemList(Of T As {ILookup, New})() As List(Of ILookup)
0 голосов
/ 26 января 2010

Я проголосовал за комментарий Джея. Он абсолютно прав. Простое добавление Implements ILookup в определение класса на самом деле не реализует интерфейс.

Вам необходимо создать фактические методы, которые диктует интерфейс.

...