如何简化枚举作为字节数组索引时的强制类型转换代码?
解决方案
方案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
相关产品推荐
相关产品推荐

