我有许多从服务返回的枚举类型,我想将它们映射到我的枚举类型。我想要的是创建一个具有所有转换逻辑的映射器类。我做了这样的事情:
public static class ErrEnumMapper
{
private static Dictionary<FullErrorTypeError, eError> dictionary;
static ErrEnumMapper()
{
var dictionary = new Dictionary<FullErrorTypeError, eError>()
{
{FullErrorTypeError.APP, eError.APPLICATION},
{FullErrorTypeError.INF, eError.INF},
{FullErrorTypeError.NO, eError.NONE},
{FullErrorTypeError.PAX, eError.PASSENGER},
{FullErrorTypeError.SYS, eError.SYSTEM}
};
}
public static eError GetEnum(FullErrorTypeError key)
{
var val = dictionary[key];
if (val != null)
return val;
throw new InvalidOperationException();
}
}
但是由于我还有很多其他枚举,这样,我将不得不创建许多静态字段(如"字典"字段)及其等效方法(如"GetEnum")......有没有更好的方法可以做到这一点?也许是通用的?
除非两组枚举的整数值或名称相同,否则如果没有某种手动映射,则无法从一个枚举值转置到另一个枚举值。
一些建议:
- 如果可能,重用原始枚举
- 保持映射枚举的整数值与原始枚举相同,以便您可以从一个枚举强制转换为另一个枚举。 对枚举名称
- 使用约定,以便可以从一个枚举映射到另一个枚举名称。
- 对每个映射的枚举值使用指示相关原始枚举值的自定义属性,并
ErrEnumMapper
读取该属性。仍然是手动映射,只是可能重新组织。
当然,本着KISS的精神,我会坚持#1,#2,或者只是处理手动映射。
也许我真的不明白你的意思......但如果它们具有相同的基础值,你可以显式转换它们:
enum FirstEnum {
ONE,
TWO,
THREE
}
enum SecondEnum {
FOUR,
FIVE,
SIX
}
static void Main(string[] args) {
FirstEnum first = FirstEnum.ONE;
SecondEnum second = (SecondEnum)first;
Console.WriteLine(second); // prints FOUR
}
这使您可以保留命名约定。