如何访问作为类型参数传递的类的共享属性

时间:2017-11-09 03:51:50

标签: vb.net class generics properties type-parameter

我试图访问作为参数传递给类型参数化过程的类的共享属性。 原因为什么我这样做是因为我可以将各种API调用端点(以及其他特定于类的事物)嵌入到类本身中的属性中。我读过一些类似的SO帖子,但没有什么能够确定它是不可能的(我认为很可能)。

以下是结构的本质 - 最后有一些伪代码:

MustInherit Class BaseClass

  Shared Property Endpoint As String
End Class

Class Person
  Inherits BaseClass

  Property Age As Integer
  Property Name As String
  Sub New()
    _Endpoint = "/GetPerson"
  End Sub
End Class

Class Event
  Inherits BaseClass

  Property When As Date
  Property Type As String
  Sub New()
    _Endpoint = "/GetEvent"
  End Sub
End Class

Function Retrieve(T As BaseClass)(Id As String) As T

  Dim oResp As HttpResponse = MakeGetCall(T.Endpoint, Id) <- T.Endpoint throws a compile error
  Return Deserialize(Of T)(oResp.Content)
End Function

Dim oPerson As Person = Retrieve(Of Person)("123")
Dim oEvent As Event = Retrieve(Of Event)("123")

对于我的小脑子,我会想到,因为T的基类是BaseClass,其中包含属性Endpoint,我会没事的。但似乎没有。

我已经在SO和其他地方尝试了很多东西来克服这个问题无济于事。是的,我意识到我可以根据T的类型执行某种端点查找,但上面代表了一个非常干净的解决方案,如果可能的话我想让它工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

假设您希望每个子类的EndPoint不同,则应使用MustOverride代替Shared ...

MustInherit Class BaseClass
  Public MustOverride Property EndPoint As String
End Class

然后在每个子类中返回一个常量

Class Person
  Inherits BaseClass
  Public Overrides Property EndPoint As String
    Get
      Return "/Person"
    End Get

您可能也想将EndPoint声明为ReadOnly

小的限制是你需要一个类的实例才能访问EndPoint(因为它不是Shared)。如果您有无参数构造函数,则可以在需要时使用(New Person).EndPoint