【问题标题】:vb.net Class constructor of itselfvb.net 自身的类构造函数
【发布时间】:2017-11-11 05:59:26
【问题描述】:

我有一个包装类来帮助反序列化传入的 json 消息。 目前我就是这样使用的。

Dim oXMessage As XMessage = JsonConvert.DeserializeObject(Of XMessage)(message)

我想为该类创建一个构造函数,以便更清晰地实例化它。像这样

Dim oXMessage as XMessage = New XMessage(message)        

我尝试了下面的构造函数,但它不起作用。 有人能指出我正确的方向吗?

Public Class XMessage
    <JsonProperty("e")> Public MessageType As String
    <JsonProperty("data")> Public MessageData As Object
    <JsonProperty("ok")> Public MessageOk As String

    Public Sub New(message As String)
        Me = JsonConvert.DeserializeObject(Of Me)(message)
    End Sub
End Class

【问题讨论】:

标签: .net json vb.net


【解决方案1】:

您不能在构造函数中重新分配Me,因为那是当前正在构造的对象。但是你可以调用JsonConvert.PopulateObject()来初始化它的内容

Public Class XMessage
    <JsonProperty("e")> Public MessageType As String
    <JsonProperty("data")> Public MessageData As Object
    <JsonProperty("ok")> Public MessageOk As String

    Public Sub New(message As String)
        JsonConvert.PopulateObject(message, Me)
    End Sub

    Public Sub New()
    End Sub
End Class

示例fiddle

【讨论】:

    【解决方案2】:

    Me关键字指的是当前实例,不能作为赋值的目标。

    相反,您可能想要做的是创建一个新对象,对其进行反序列化,然后将新对象的成员变量复制到当前实例。

    编辑:没有辅助函数

    Public Class XMessage
    
        <JsonProperty("e")> Public MessageType As String
        <JsonProperty("data")> Public MessageData As Object
        <JsonProperty("ok")> Public MessageOk As String
    
        Public Sub New(message As String)
            Dim other = JsonConvert.DeserializeObject(Of XMessage)(message)
            Me.MessageType = other.MessageType
            Me.MessageData = other.MessageData
            Me.MessageOk = other.MessageOk
        End Sub
    
    End Class
    

    原文:

    Public Class XMessage
    
        <JsonProperty("e")> Public MessageType As String
        <JsonProperty("data")> Public MessageData As Object
        <JsonProperty("ok")> Public MessageOk As String
    
    
        Public Sub New(message As String)
            Dim other as XMessage= Deserialize(message)
            Me.MessageType = other.MessageType
            Me.MessageData = other.MessageData
            Me.MessageOk = other.MessageOk
        End Sub
    
    
        Public shared Function Deserialize(message as String) as XMessage
            return JsonConvert.DeserializeObject(Of XMessage)(message)
        End Function
    
        Public Shared Function Serialize(message As XMessage) As String 
            return JsonConvert.SerializeObject(message)
        End Function
    
    End Class
    

    【讨论】:

    • 我希望有一种巧妙的语法可以避免创建另一个实例。不过,此解决方案效果很好 - 谢谢。
    • 其实现在我测试正常,我可以看到这种方法创建了一个无限递归。
    • 如果照原样复制代码,这里应该没有递归。
    • 添加了一个没有辅助方法的简化版本
    • 感谢您的宝贵时间,也许我描述有误。当我使用 "{""e"":""connected""}" 创建对象并逐步完成时。 1.New 调用 message="{""e"":""connected""}"。 2. 然后执行 Dim 行。 3. 接下来,New sub 再次被调用,message=nothing。 4. Dim 行被执行,由于 message=nothing 导致错误。
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多