6

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

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)

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

4

5 回答 5

4

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

public enum ServerEnum
{
   One = ClientEnum.ABC,
}

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

于 2008-12-29T19:38:53.150 回答
0

我可能会使用 struct 作为类型,如果它不是 Enum 类型,则抛出异常。我看不出您的 (Type, string) 选项比使用对象或结构更安全。

于 2008-09-02T17:41:07.140 回答
0

以下是可以作为属性参数包含的类型的规则:

于 2008-09-02T17:44:12.487 回答
0

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

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

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

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

于 2008-09-02T17:53:54.100 回答
0

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

于 2008-09-02T18:15:22.100 回答