代码之家  ›  专栏  ›  技术社区  ›  Ben McNiel

使用属性减少enum-to-enum映射和enum/const-to-action开关语句

  •  6
  • Ben McNiel  · 技术社区  · 18 年前

    我想每个人都见过这样的代码:

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

    我们可以这样做,而不是悲伤:

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

    现在我们可以使用反射来遍历ServerEnum并从enum声明本身获取转换映射。

    这是可行的,但用枚举e替换对象o不行。我不希望能够将对象传递给构造函数,而只传递其他枚举。

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

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

    编译错误有什么原因吗?除此之外,我还能如何传递地图所需的信息:

    EnumtoEnumAttribute(Type dest, string enumString)
    

    这似乎太冗长,但如果这是唯一的方法,那么我想我会使用它。

    5 回复  |  直到 17 年前
        1
  •  4
  •   Scott Dorman    17 年前

    使用几乎相同的示例,可以直接在枚举中实现:

    public enum ServerEnum
    {
       One = ClientEnum.ABC,
    }
    

    这样做的好处是不需要反思,更容易阅读(在我看来),而且总体上需要更少的开销。

        2
  •  0
  •   bdukes Jon Skeet    18 年前

    我可能会使用struct作为类型,如果不是枚举类型,则抛出异常。我看不出(Type,string)选项比使用object或struct更安全。

        3
  •  0
  •   Ben McNiel    18 年前

    @Danial Jennings我通读了那里的规则,发现:“一个枚举类型,只要它具有公共可访问性,并且它嵌套的类型(如果有的话)也具有公共可访问性(第17.2节)”。

    如何根据引用的规则在构造函数中尝试Enum e失败?是因为属于enum类型不能保证传入的枚举是公开可见的吗?这似乎是对的。有没有办法在编译时强制执行这个规则?

    @B你肯定是对的。我应该多想想。

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

        4
  •  0
  •   Daren Thomas    18 年前

        5
  •  0
  •   Bobby    15 年前

    Here are the rules 对于可包含为属性参数的类型: