【发布时间】:2015-01-27 18:47:07
【问题描述】:
枚举中的值范围上有多个线程(不可能)。 但是我有以下问题并寻找最佳解决方案,其中提供的任何一个都没有真正让我满意。
协议的规范说消息的字节[x],即消息类型,具有以下可能的值(幻想值):
0x00 = get
0x01 = set
0x02 to 0xFF = identify
所以只有 3 个不同的逻辑选项,最好在一个枚举中处理。但是n个逻辑选项中的一个有m个不同的数值对应物,这是不可能在一个枚举中处理的。
对于此类问题,最好(最干净)的解决方案是什么? 我可以建立一个类
class MessageType {
public enum MessageTypeEnum {
get = 0x00,
set = 0x01,
identify = 0x02
}
public static MessageTypeEnum getLogicalValue (byte numericalValue)
{
if (numericalValue < 0x02)
return (MessageTypeEnum(numericalValue));
else
return MessageTypeEnum.identify;
}
}
我也可以创建一个没有枚举但有静态成员的类。
无论哪种方式都有一个问题:如果有人试图发送一个数据包,他可能会使用
if (messageBytes[x] == (byte)MessageTypeEnum.identify) {
// do stuff
}
但是 messageByte[x] 可以是 0x02 和 0xFF 之间的任何值,因此“命中”枚举中指定的值纯属运气。另一方面,我希望枚举(或静态成员)是公开的,以便于构建消息。
我能否以某种方式强制使用我的 getLogicalValue()-Function? 有没有更优雅的解决方案?
我想要的只是一种简单且结构良好的方法,可以将逻辑值链接到 n:m 关系中的数值。尤其是给定的协议有很多这样的情况,我想保持我的代码整洁。
感谢您的帮助和时间:)
贾尼斯
【问题讨论】:
-
我想您的意思是
messageBytes[x] == (byte)...而不是=,这将是一项任务。您永远无法完全阻止人们将一种类型强制转换为另一种类型(除非您覆盖转换运算符并抛出异常)。如果有人想滥用你的代码,他们会的。 -
是的,我的意思是“==”。当我来自其他语言并直接在评论窗口中输入代码时,这个错误发生在我身上。至于代码滥用:问题是我自己在使用我要构建的 .dll 时可能会犯这个错误,因为枚举(通常)是双向函数(逻辑值 数值)