2008-09-02 99 views
6

我想大家都看过类似的代码:使用属性以减少枚举枚举映射和枚举/常量行动开关statments

public void Server2ClientEnumConvert(ServerEnum server) 
{ 
    switch(server) 
    { 
     case ServerEnum.One: 
      return ClientEnum.ABC 
     //And so on. 

相反,这个坏我们可以做财产以后类似的:

public enum ServerEnum 
{ 
    [Enum2Enum(ClientEnum.ABC)] 
    One, 
} 

现在我们可以使用反射来通过ServerEnum翻录并从枚举声明本身获取转换映射。

我在这里遇到的问题是在Enum2Enum属性的声明中。

这个工作,但用Enum e替换对象o不行。我不想将对象传递给构造函数,只能传入其他枚举。

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(object o){} 
} 

这不能编译。

public class EnumToEnumAttribute : Attribute 
{ 
    public EnumToEnumAttribute(Enum e){} 
} 

是否有编译错误的原因?我还能怎样传递到除了地图所需的信息:

EnumtoEnumAttribute(Type dest, string enumString) 

这似乎太冗长,但如果它是唯一的出路,然后我想我会用它。

+0

你得到了什么编译错误?哪里? – 2008-12-26 06:55:35

回答

0

我可能会使用结构作为类型,然后抛出一个异常,如果它不是一个枚举类型。我没有看到你的(类型,字符串)选项比使用对象或结构更安全。

0

@Danial詹宁斯我通过规则有阅读和发现:“枚举类型,只要它具有公共可访问性和类型在其中嵌套(如果有的话)也具有公共可访问性(第17.2节)。“

如何在构造函数中尝试Enum e基于引用的规则失败?是否因为类型枚举不能保证传入的枚举是公开可见的?这似乎是正确的。在编译时有没有办法强制这条规则?

@ bdukes你是完全正确的。我应该多想一想。

它看起来像运行时类型检查是我唯一的选择,以确保我只是将枚举映射到其他枚举。

0

为什么不使用字典?这可能是你的类的静态属性,用我们在3.0中获得的那些奇特的schmancy对象初始值设定项初始化?你不会输入更多的代码(即使使用Attribute solution也必须完成映射)。

4

使用几乎相同的例子,你可以直接在枚举实现这一点:

public enum ServerEnum 
{ 
    One = ClientEnum.ABC, 
} 

这具有不需要思考的好处,更易于读取(在我看来),以及整体需要更少的开销。