将flaggable枚举映射到数组

SeT*_*ToY 2 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

use*_*830 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
    }
Run Code Online (Sandbox Code Playgroud)

甚至你可以使用这些值:

    [Flags]
    public enum OurEnum
    {
        Geothermal=1,
        SolarHeating=2,
        NoInformation=4
    }
Run Code Online (Sandbox Code Playgroud)

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

        var ourValue = OurEnum.Geothermal | OurEnum.NoInformation;
        var theirValue = (TheirEnum) ourValue;
Run Code Online (Sandbox Code Playgroud)

最后我们可以简单地创建一个基于标记枚举的数组theirValue:

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