将可标记的枚举映射到数组

本文关键字:映射 数组 枚举 | 更新日期: 2023-09-27 18:31:27

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

为此,我使用以下代码:

    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 多个条目,我认为这会变得非常混乱和丑陋。有没有更好的方法可以做到这一点?

将可标记的枚举映射到数组

一个简单的解决方案是基于TheirEnum创建OurEnum,然后一个简单的强制转换就可以了。

下面是一个示例:

    [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();