使用属性来减少enum到枚举映射和enum / const到动作切换语句

时间:2008-09-02 17:32:15

标签: c# reflection enums attributes

我想每个人都看过如下代码:

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)

这看起来过于冗长,但如果这是唯一的方式,那么我想我会用它。

5 个答案:

答案 0 :(得分:4)

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

public enum ServerEnum
{
   One = ClientEnum.ABC,
}

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

答案 1 :(得分:0)

我可能会使用struct作为类型,然后如果它不是Enum类型则抛出异常。我没有看到你的(Type,string)选项比使用object或struct更安全。

答案 2 :(得分:0)

Here are the rules表示可以作为属性参数包含的类型:

答案 3 :(得分:0)

  

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

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

  

@ bdukes你完全正确。我应该考虑更多。

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

答案 4 :(得分:0)

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