【问题标题】:How To Access A Shared Property Of A Class Passed As A Type Parameter如何访问作为类型参数传递的类的共享属性
【发布时间】:2017-11-09 03:51:49
【问题描述】:

我正在尝试访问作为参数传递给类型参数化过程的类的共享属性。 原因 我这样做的原因是我可以将各种 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 的类型执行某种端点查找,但以上代表了一个非常干净的解决方案,如果可能的话,我希望它能够工作。

有什么想法吗?

【问题讨论】:

  • 鉴于您已经将该方法绑定到 BaseClass 类型并使用它作为约束,那么尝试避免在方法中简单地获取 BaseClass.EndPoint 有什么意义?
  • 基类上的共享属性将在所有子类中发生变化!换句话说,Person.EndPoint 将始终与Event.EndPoint 相同,因为该值仅存储在基类中。
  • @jmcilhinney BaseClass.Endpoint 在执行MakeGetCall 行时为空。 Person/Event 仅在 Return 行上发生反序列化时实例化。但你让我思考。我在调用之前实例化了一个虚拟的Record 对象:Dim oDummy As BaseClass = Activator.CreateInstance(Of T)(),这让我可以使用你的建议。它有点混乱,但比替代品要好。谢谢。
  • @SSS 我不认为你在那里。当PersonEvent 被实例化时,_Endpoint 被设置并且在BaseClass 中可用。
  • 测试一下 - 创建一个New Person,然后创建一个New Event,然后检查两个对象上Endpoint 的每个值

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


【解决方案1】:

假设您希望每个子类的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

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2015-04-19
    • 2011-02-05
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多