我想每个人都看过如下代码:
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 :(得分: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也必须完成映射)。