You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过动态选择FIX4.4/FIX4.3版本简化下述代码?

简化不同FIX版本Heartbeat消息创建的VB.NET代码

原始代码

Select Case FIXV
    Case "FIX44"
        Dim _message As QuickFix.FIX44.Heartbeat = New QuickFix.FIX44.Heartbeat

        _message.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum))
        _message.Header.SetField(New MsgType(0))
        _message.Validate()

    Case "FIX43"
        Dim _message As QuickFix.FIX43.Heartbeat = New QuickFix.FIX43.Heartbeat

        _message.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum))
        _message.Header.SetField(New MsgType(0))
        _message.Validate()

    Case Else

End Select

简化方案

当然可以简化,核心是抽离重复的字段设置与校验逻辑,以下是两种实用方案:

方案一:利用基类多态(推荐)

QuickFix各版本的Heartbeat消息均继承自QuickFix.Message基类,可先统一创建实例,再通过基类引用执行通用逻辑:

' VB.NET 14+ 支持switch表达式写法
Dim heartbeatMessage As QuickFix.Message = FIXV switch
    Case "FIX44" New QuickFix.FIX44.Heartbeat()
    Case "FIX43" New QuickFix.FIX43.Heartbeat()
    Case Else Nothing
End Switch

If heartbeatMessage IsNot Nothing Then
    heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum))
    heartbeatMessage.Header.SetField(New MsgType(0))
    heartbeatMessage.Validate()
End If

如果是旧版本VB.NET,可改用Select Case先实例化基类对象:

Dim heartbeatMessage As QuickFix.Message = Nothing
Select Case FIXV
    Case "FIX44"
        heartbeatMessage = New QuickFix.FIX44.Heartbeat()
    Case "FIX43"
        heartbeatMessage = New QuickFix.FIX43.Heartbeat()
End Select

If heartbeatMessage IsNot Nothing Then
    heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum))
    heartbeatMessage.Header.SetField(New MsgType(0))
    heartbeatMessage.Validate()
End If

方案二:反射动态创建实例

如果后续需要支持更多FIX版本,反射可以避免频繁修改分支判断:

Dim heartbeatFullTypeName = $"QuickFix.{FIXV}.Heartbeat"
Dim heartbeatType As Type = Type.GetType(heartbeatFullTypeName)

If heartbeatType IsNot Nothing Then
    Dim heartbeatMessage As QuickFix.Message = DirectCast(Activator.CreateInstance(heartbeatType), QuickFix.Message)
    heartbeatMessage.Header.SetField(New MsgSeqNum(_csession.NextSenderMsgSeqNum))
    heartbeatMessage.Header.SetField(New MsgType(0))
    heartbeatMessage.Validate()
End If

两种方案都能有效消除代码冗余,提升可维护性。

内容的提问来源于stack exchange,提问作者Wayne Graham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:30:51