我有一个定义为
的类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?
答案 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(通用方法)
*不在班级范围内。