【问题标题】:type casting classes mimiking enums类型转换类模仿枚举
【发布时间】: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


【解决方案1】:

首先,您的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)1

【讨论】:

    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 2010-10-11
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多