【发布时间】:2014-11-20 09:19:47
【问题描述】:
我使用第 3 方应用程序进行输出。有几个 int 属性,我想通过枚举处理不同属性的 int 值。
Property1 可以是 0,1,2
Property2 可以是 0,1
Property3 可以是 1,2
我认为我应该有枚举继承,这不是 c# 中的选项。
所以我通过使用类来解决它(我正在使用 Tono Nam 的另一个主题的答案: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,但我不确定。
您认为我的解析器方法有多安全?这段代码有什么错误吗?或者我可以安全地使用它吗?
您知道演员阵容有什么更好、更优雅或更简单的解决方案吗?
【问题讨论】:
标签: c# class inheritance enums .net-4.5