2010-07-28 62 views
1

我有被定义为我可以在类属性中使用泛型吗?

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

+0

你能发表一个从你的基类继承的类声明的例子吗? – 2010-07-30 16:43:12

回答

-1

.NET仅支持泛型类参数的泛型属性,不支持独立*。您使用E创建的文件

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

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

*不能在类的范围。

+0

什么是“你用E创建的一个独立的”是什么意思?请修改您的评论意义。 – Gabe 2010-07-29 00:07:24

+0

@加贝修改了。它的好吗? – 2010-07-29 00:28:28

+0

我还是不明白。 – Gabe 2010-07-29 04:05:50

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

0

我知道帖子是旧的,但对于其他人看..我认为你可以这样做:借用Rowland Shaw的代码示例只需要在类级别/属性声明中进行小的更改。

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 
相关问题