2012-10-17 298 views
0

我有很多从服务返回并想要映射到我的枚举类型的枚举类型。 我想要的是创建一个具有所有转换逻辑的映射器类。 我做了这样的事情:将枚举转换为其他枚举

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 “)...有一个更好的方法吗? 通用也许?

+2

如果你想映射所有枚举1on1,为什么不使用它们呢? – KyorCode

+0

我们的域名应用程序中有一个命名约定,由我们的系统架构师指定 –

+0

我不认为您可以通用。如果您可以确定通常哪个值映射到哪个其他值,则可以使用反射来完成。 (你的GetEnum函数可能是通用的,但我认为你需要一个字典的附加字典来选择给定类型的正确字典)。 –

回答

2

除非两个枚举集的整数值或名称相同,否则不能将某个枚举值转换为另一个枚举值,而无需进行某种手动映射。

几点建议:

  1. 重用如果可能的话
  2. 保持映射枚举一样的原始枚举的整数值,所以你可以从一个到另一个投原来的枚举。
  3. 为枚举名称使用约定,以便您可以从一个映射到另一个。
  4. 在每个映射的枚举值上使用自定义属性,指示相关的原始枚举值,并且ErrEnumMapper读取该属性。仍然手动映射,也许重新组织。

当然,本着KISS的精神,我会坚持#1,#2,或者只是处理手动映射。

+0

多数民众赞成在我的想法,但我没有控制服务枚举,他们的整数/顺序等。 –

0

也许我真的不得到你的意思..但你可以明确地投他们,如果他们有相同的基本价值:

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 
} 

这可以让你保持你的命名约定..