我使用第三方应用程序进行输出。有几个int属性,我想通过enum处理不同属性的int值。
Property1可能为0,1,2
Property2可能是0,1
Property3可能是1,2
我认为我应该拥有枚举继承,这在c#中不是选项。
因此,我通过使用类来解决这个问题(我正在使用Tono从另一个主题到这个目的的答案:https://stackoverflow.com/a/23430174/4273304)。
public class MyEnum : IEquatable<MyEnum>
{
public static readonly MyEnum Undefined = new MyEnum(-1, "Undefined");
public int Value { get; private set; }
public string Name { get; private set; }
protected MyEnum(int value, string name)
{
this.Value = value;
this.Name = name;
}
public bool Equals(MyEnum b)
{
return this.Name == b.Name && this.Value == b.Value;
}
public override string ToString()
{
return this.Name;
}
public static T Parse<T>(int value)
{
object obj;
Type t_type = typeof(T);
var fiList = t_type.GetFields(BindingFlags.Public | BindingFlags.Static).Where(f => f.FieldType == typeof(T)).ToArray();
foreach(FieldInfo en in fiList)
{
object tmp = en.GetValue(null);
if (((MyEnum)tmp).Value == value)
return (T)tmp;
}
obj = MyEnum.Undefined;
return (T)obj;
}
}
public class MyEnumChild1 : MyEnum
{
public static readonly MyEnumChild1 A = new MyEnumChild1(0, "A");
public static readonly MyEnumChild1 B = new MyEnumChild1(1, "B");
private MyEnumChild1(int value, string name)
: base(value, name)
{
}
}
public class MyEnumChild2 : MyEnum
{
public static readonly MyEnumChild2 A = new MyEnumChild2(0, "A");
public static readonly MyEnumChild2 C = new MyEnumChild2(1, "C");
private MyEnumChild2(int value, string name)
: base(value, name)
{
}
}
public class MyEnumChild3 : MyEnum
{
public static readonly MyEnumChild3 D = new MyEnumChild3(0, "D");
public static readonly MyEnumChild3 E = new MyEnumChild3(1, "E");
private MyEnumChild3(int value, string name)
: base(value, name)
{
}
}这个解决方案符合我的目的,但我不知道如何将int转换到MyEnumChild1。
我创建了一个解析器方法:
MyEnumChild1 MEC1 = MyEnum.Parse <MyEnumChild1>(1);它似乎工作得很好,MEC1现在是MyEnumChild1.B 1.B,但我不确定。
您认为我的解析器方法有多安全?这段代码中有错误吗?或者我可以安全地使用它?
你知道更好的,优雅的或更简单的解决方案吗?
发布于 2014-11-20 09:36:26
首先,Parse方法应该对T设置一个约束
public static T Parse<T>(int value) where T : MyEnum其次,可以将其改为保护,并以这种方式在每个派生枚举中实现一个强制转换操作符:
public static explicit operator MyEnumChild1(int value)
{
return Parse<MyEnumChild1>(value);
}并以一种更经典的方式使用:
MyEnumChild1 mec1 = (MyEnumChild1)1https://stackoverflow.com/questions/27035805
复制相似问题