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

如何简化枚举作为字节数组索引时的强制类型转换代码?

解决方案

方案1:给枚举添加扩展方法

把强制转换的逻辑封装到扩展方法里,直接通过枚举成员获取数组对应位置的值,彻底消除重复的类型转换代码:

enum CarSpeeds
{
    CarBlue = 1,
    CarRed = 2,
    CarYellow = 3
}

public static class CarSpeedsExtensions
{
    public static byte GetSpeed(this CarSpeeds speed, byte[] buffer)
    {
        return buffer[(int)speed];
    }
}

// 使用示例
LabelCarBlueSpeed.Text = CarSpeeds.CarBlue.GetSpeed(myByte) + " km/h";
LabelCarRedSpeed.Text = CarSpeeds.CarRed.GetSpeed(myByte) + " km/h";
LabelCarYellowSpeed.Text = CarSpeeds.CarYellow.GetSpeed(myByte) + " km/h";

方案2:创建缓冲区包装类

用包装类封装byte数组,通过枚举作为索引器访问,内部自动处理类型转换,适合需要频繁访问缓冲区的场景:

enum CarSpeeds
{
    CarBlue = 1,
    CarRed = 2,
    CarYellow = 3
}

public class PLCBufferWrapper
{
    private readonly byte[] _buffer;

    public PLCBufferWrapper(byte[] buffer)
    {
        _buffer = buffer;
    }

    public byte this[CarSpeeds speed]
    {
        get => _buffer[(int)speed];
        set => _buffer[(int)speed] = value;
    }
}

// 使用示例
var bufferWrapper = new PLCBufferWrapper(myByte);
LabelCarBlueSpeed.Text = bufferWrapper[CarSpeeds.CarBlue] + " km/h";
LabelCarRedSpeed.Text = bufferWrapper[CarSpeeds.CarRed] + " km/h";
LabelCarYellowSpeed.Text = bufferWrapper[CarSpeeds.CarYellow] + " km/h";

方案3:轻量辅助方法

如果不想额外定义类或扩展方法,写一个简单的辅助函数也能减少重复代码:

private byte GetBufferValue(byte[] buffer, CarSpeeds speed)
{
    return buffer[(int)speed];
}

// 使用示例
LabelCarBlueSpeed.Text = GetBufferValue(myByte, CarSpeeds.CarBlue) + " km/h";

以上几种方式都能保留byte数组作为PLC数据缓冲区的核心需求,同时大幅提升代码可读性,避免重复的强制转换代码。

内容的提问来源于stack exchange,提问作者Mert Atmaca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:23:03