Могу ли я иметь дженерики в свойстве класса? - PullRequest
1 голос
/ 29 июля 2010

У меня есть класс, который определяется как

Public MustInherit Class Entity(Of T As Entity(Of T))

И различные классы, полученные из него. Я хотел бы, чтобы другой класс принял все производные объекты в качестве свойства, но я не могу найти работоспособный синтаксис. Если бы это был параметр сабвуфера, я мог бы сказать

Public Sub Foo(T As Entity(Of T))(TheEntity As T)

Я не могу заставить это работать на собственность:

Public Property E(Of Entity(Of T))() As Entity(Of T)

Дает мне "Параметры типа не могут быть указаны в этом объявлении"

Public Property E() As Entity2008(Of T)

Дает мне "Параметр типа T не наследует и не реализует тип ограничения ..."

Есть ли приемлемый способ сделать это, или я застрял с использованием Set Sub и Get Get?

Ответы [ 3 ]

1 голос
/ 31 июля 2010

Чтобы объявить свойство, компилятору необходимо знать во время компиляции, каким будет тип. (Это то, что могут делать методы, а свойства - нет).

Рассмотрим случай, когда вы связывали данные IEnumerable(Of yourtype) с DataGridView, который перечислит все свойства и создаст столбец для каждого из них. Когда он достигает гипотетического универсального свойства, у него нет информации, какой тип заменить.

Рассмотрим случай, когда у вас есть экземпляр вашего класса, и вы задали свойство E - можно было бы установить два свойства с двумя разными сигнатурами, возможно, одно из них:

foo.E(Of Entity(Of Byte)) = New Entity(Of Byte)

А еще как:

foo.E(Of Entity(Of Guid)) = New Entity(Of Guid)

Итак, должны устанавливать разные свойства? Должна ли установка одной подписи устанавливать значение для другой? Очевидно, что в приведенном выше случае типы не могут быть преобразованы друг в друга.

Вам ничто не мешает:

Public MustInherit Class Entity(Of T As Entity(Of T))
    Public Property E() As Entity(Of T)
        Get
            Throw New NotImplementedException()
        End Get
        Set
            Throw New NotImplementedException()
        End Set
    End Property
End Class

И в этом случае вы можете иметь только один и тот же тип для сущности, и его свойство E должно быть того же типа, что и он сам (если вы не украсите дисперсию )

0 голосов
/ 23 октября 2016

Я знаю, что сообщение старое, но для тех, кто ищет ... Я думаю, вы можете сделать это: заимствовать пример кода у Роуленда Шоу только небольшое изменение в объявлении уровня класса / свойства.

Public MustInherit Class Entity(Of T)  
    Public Property E() As T ' or if you like Entity(Of T) 
        Get
            Throw New NotImplementedException()
        End Get
        Set
            Throw New NotImplementedException()
        End Set
    End Property
End Class
0 голосов
/ 29 июля 2010

.NET поддерживает только универсальное свойство для универсального параметра класса, не поддерживает Independ *.То, что вы создаете с помощью E

Эта способность предназначена только для методов.Свойства или индексаторы могут использовать только параметры универсального типа, определенные в области видимости класса.

http://msdn.microsoft.com/en-us/library/ms379564 (универсальные методы)

* не входят в область действия класса.

...