将flaggable枚举映射到数组

时间:2014-11-22 16:02:12

标签: c# enums bit-manipulation

我有一个数据库中的可标记枚举,我想将其转换为第三方的枚举数组。

为此,我使用以下代码:

    private TheirEnum[] GetTheirEnums(MyEnum? ourEnums)
    {
        List<TheirEnum> result = new List<TheirEnum>();
        if (ourEnums != null)
        {
            if (ourEnums.Value.HasFlag(MyEnum.Geothermal))
            {
                result.Add(TheirEnum.GEOTHERMAL);
            }

            if (ourEnums.Value.HasFlag(MyEnum.SolarHeating))
            {
                result.Add(TheirEnum.SOLAR_HEATING);
            }
        }
        else
        {
            result.Add(TheirEnum.NO_INFORMATION);
        }

        return result.ToArray();
    }

然而,由于该枚举列表中有超过50个条目,我认为这会变得非常混乱和丑陋。有更好的方法吗?

1 个答案:

答案 0 :(得分:6)

一个简单的解决方案是根据OurEnum创建TheirEnum,然后一个简单的演员就可以了。

这是一个例子:

    [Flags]
    public enum TheirEnum
    {
        GEOTHERMAL=1,
        SOLAR_HEATING=2,
        NO_INFORMATION=4
    }


    [Flags]
    public enum OurEnum
    {
        Geothermal=TheirEnum.GEOTHERMAL,
        SolarHeating=TheirEnum.SOLAR_HEATING,
        NoInformation=TheirEnum.NO_INFORMATION
    }

甚至你可以使用这些值:

    [Flags]
    public enum OurEnum
    {
        Geothermal=1,
        SolarHeating=2,
        NoInformation=4
    }

然后一个简单的演员会转换它:

        var ourValue = OurEnum.Geothermal | OurEnum.NoInformation;
        var theirValue = (TheirEnum) ourValue;

最后我们可以根据theirValue中的标记枚举创建一个数组:

        var values=Enum.GetValues(typeof(TheirEnum));
        var array= (from TheirEnum v in values where theirValue.HasFlag(v) select v).ToArray();