【发布时间】: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 我不认为你在那里。当
Person或Event被实例化时,_Endpoint被设置并且在BaseClass中可用。 -
测试一下 - 创建一个
New Person,然后创建一个New Event,然后检查两个对象上Endpoint的每个值
标签: vb.net class generics properties type-parameter