我可以在Class Property中使用泛型吗?

时间:2010-07-28 23:29:14

标签: vb.net generic-type-argument

我有一个定义为

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

各种类派生自它。我想让另一个类接受所有派生对象作为属性,但我无法找到可行的语法。如果它是sub的参数,我可以说

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 Function?

3 个答案:

答案 0 :(得分:1)

要声明属性,编译器需要在编译时知道类型是什么。 (这是方法可以做的,属性不能)。

考虑将数据绑定到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属性必须与其自身具有相同的类型(除非您为variance进行装饰)

答案 1 :(得分:0)

我知道Post很老但是对于其他人来说......我认为你可以这样做:从Rowland Shaw借用Code示例只在Class级别/属性声明中进行一些小改动。

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

答案 2 :(得分:-1)

.NET仅支持泛型类参数的泛型属性,不支持independ *。您正在使用E

创建
  

此功能仅适用于方法。属性或索引器只能使用在类的范围内定义的泛型类型参数。

http://msdn.microsoft.com/en-us/library/ms379564(通用方法)

*不在班级范围内。