具有条件成员的结构

Structures with conditional members

我正在尝试在 VB 中构建一个结构,以允许我存储和解析我收到的基于 IP/UDP 的消息,该消息是 ASCII 编码的 HEX。

诀窍是在我通过IP头和UDP头之后,后面的数据是可变结构类型的。我的意思是,有一个基本的初始消息结构,其中包含特定字段中的数据......其中三分之二是可选的......但是实际数据,传输的真正内容,在 15 个不同的消息之一中结构。

那么有没有一种方法可以根据我放入其中的数据有条件地定义结构的其中一个成员?

我的计划是创建一个 New() 函数,您只需将消息字符串传递给该函数,它就会解析出所有数据并根据需要填充结构的成员。但是,如何使其中一个结构成员的声明类型依赖于将在 New() 函数中解析出的数据?或者真的没有办法做到这一点?

基本上(虽然粗略)像这样:

Private Structure DevMsg
    ReadOnly IPHeader As IP_HDR
    ReadOnly UDPHeader As UDP_HDR
    ReadOnly MsgType As DevMsgType
    Select Case MsgType
        Case Msg0
            ReadOnly Data as MsgType0
        Case Msg1
            ReadOnly Data as MsgType1
        ...
    End Select

    Public Sub New(ByVal msg as String)

        ... String parser ...

        MsgType = blah

        ... More parsing ...

        Data.property0 = blah2
        Data.property1 = blah3
        ...

    End Sub
End Structure

根据您所说的,听起来 class 比结构更适合您的需求(参见 MSDN)。您应该从一个抽象基础 class 开始,然后在派生自它的 class 中定义所有 "flavors"。

此外,我不会在构造函数中完成所有构建;相反,我会定义一个单独的 "builder" class,它可以根据您的需要构建各种类型的实例。

您可能还会发现 an abstract factory 场景比构建器更适合您的需求,因为您正在处理 "family" 个对象。

这里是了解各种创造性设计模式的良好起点,包括 "builder" 和 "abstract factory":https://en.wikipedia.org/wiki/Creational_pattern

我认为你应该做的是为从基础继承的每种类型的消息提供 base/abstract class 和具体的 classes。

像这样:

Public MustInherit Class MessageBase
    Public ReadOnly Header As String
    Public ReadOnly MsgType As Integer
    Public Function CreateMessage(message As String) As MessageBase
        If message = "type1" Then Return New Type1Message
        If message = "type1" Then Return New Type2Message
        'etc.
    End Function
End Class

Public Class Type1Message
    Inherits MessageBase
End Class

Public Class Type2Message
    Inherits MessageBase
End Class

这样您就可以在基础中共享通用属性 class 并为每条消息添加不同的属性。

请注意,每个具体 class 都需要一个构造函数来根据其自己的规则解析数据,但为了清楚起见,我将其省略