首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟枚举的类型铸造类

模拟枚举的类型铸造类
EN

Stack Overflow用户
提问于 2014-11-20 09:19:47
回答 1查看 46关注 0票数 0

我使用第三方应用程序进行输出。有几个int属性,我想通过enum处理不同属性的int值。

Property1可能为0,1,2

Property2可能是0,1

Property3可能是1,2

我认为我应该拥有枚举继承,这在c#中不是选项。

因此,我通过使用类来解决这个问题(我正在使用Tono从另一个主题到这个目的的答案:https://stackoverflow.com/a/23430174/4273304)。

代码语言:javascript
复制
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。

我创建了一个解析器方法:

代码语言:javascript
复制
MyEnumChild1 MEC1 = MyEnum.Parse <MyEnumChild1>(1);

它似乎工作得很好,MEC1现在是MyEnumChild1.B 1.B,但我不确定。

您认为我的解析器方法有多安全?这段代码中有错误吗?或者我可以安全地使用它?

你知道更好的,优雅的或更简单的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-20 09:36:26

首先,Parse方法应该对T设置一个约束

代码语言:javascript
复制
public static T Parse<T>(int value) where T : MyEnum

其次,可以将其改为保护,并以这种方式在每个派生枚举中实现一个强制转换操作符:

代码语言:javascript
复制
public static explicit operator MyEnumChild1(int value)
{
    return Parse<MyEnumChild1>(value);
}

并以一种更经典的方式使用:

代码语言:javascript
复制
MyEnumChild1 mec1 = (MyEnumChild1)1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27035805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档