另请参阅问题末尾的更新...
鉴于以下情况:
[Flags]
enum SourceEnum
{
SNone = 0x00,
SA = 0x01,
SB = 0x02,
SC = 0x04,
SD = 0x08,
SAB = SA | SB,
SALL = -1,
}
[Flags]
enum DestEnum
{
DNone = 0x00,
DA = 0x01,
DB = 0x02,
DC = 0x04,
DALL = 0xFF,
}
我想使用大 switch() 之类的名称基于映射函数将一种枚举类型转换为另一种类型,反之亦然,但由于这是一个标志枚举,我很难将这样的例程设计为通用的。
基本上,我想要的是如下内容:
示例 #1
SourceEnum source = SourceEnum.SA;
DestEnum dest = Map<Source, Dest> (source);
Assert.That (dest, Is.EqualTo (DestEnum.DA));
示例 #2
SourceEnum source = SourceEnum.SA | SourceEnum.SB;
DestEnum dest = Map<Source, Dest> (source);
Assert.That (dest, Is.EqualTo (DestEnum.DA | DestEnum.DB));
示例#3
SourceEnum source = SourceEnum.SAB;
DestEnum dest = Map<Source, Dest> (source);
Assert.That (dest, Is.EqualTo (DestEnum.DA | DestEnum.DB));
示例 #4
SourceEnum source = SourceEnum.SALL;
DestEnum dest = Map<Source, Dest> (source);
Assert.That (dest, Is.EqualTo (DestEnum.DALL));
示例#5
SourceEnum source = SourceEnum.SD;
var ex = Assert.Throws<Exception> (() => Map<Source, Dest> (source));
Assert.That (ex.Message, Is.EqualTo ("Cannot map SourceEnum.SD to DestEnum!"));
Map() 函数可以接受一个委托来提供实际的映射,但我仍然需要有几个函数来帮助这样一个委托的位......
DestEnum SourceToDestMapper (SourceEnum source)
{
// Switch cannot work with bit fields enumeration...
// This is to give the general idea...
switch (source)
{
case SourceEnum.SNone:
return DestEnum.DNone;
case SourceEnum.SA:
return DestEnum.DA;
case SourceEnum.SAB:
return DestEnum.DA | DestEnum.DB;
...
default:
throw new Exception ("Cannot map " + source.ToString() + " to DestEnum!");
}
}
编辑:澄清
枚举定义的值似乎彼此适合,但不一定如此。
例如,它可能是:
enum SourceEnum
{
SA = 0x08,
SB = 0x20,
SC = 0x10,
SAB = SA | SB,
SABC = SA | SB | SC,
}
enum DestEnum
{
DA = 0x04,
DB = 0x80,
DC = 0x01,
DAB = DA | DB,
}
编辑:更多信息
我正在研究一种对枚举标志进行自定义映射的方法,而不是基于名称上的模式。但是,这些名称用于自定义映射函数。
例如,我完全有可能拥有一个 SourceToDestMapper 函数来尝试将 SA 映射到 DC...
主要问题是为 SourceToDestMapper 函数提供源的每个标志,并处理具有多个位集的标志值......
例如:拥有一个标志 SourceEnum.SABC 将调用 SourceToDestMapper 函数 3 次,结果如下:
- SourceEnum.SA 映射到 DestEnum.DA
- SourceEnum.SB 映射到 DestEnum.DB
- SourceEnum.SC 映射到 DestEnum.DC
结果 DestEnum 将是: DestEnum.DA | 目标枚举.DB | 目标枚举.DC