Converti alcune proprietà bool in un flags enum

Converti alcune proprietà bool in un flags enum

che ne dici di una cosa del genere?

using System;

namespace ConsoleApplication1
{

    [Flags]
    public enum FlagEnum
    {
        EnumValue1 = 1,
        EnumValue2 = 2,
        EnumValue3 = 4
    }

    public static class LegacyClass
    {
        public static bool PropA { get; set; }
        public static bool PropB { get; set; }
        public static bool PropC { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            LegacyClass.PropB = true;
            FlagEnum result = LegacyClass.PropA ? FlagEnum.EnumValue1 : 0;
            result |= LegacyClass.PropB ? FlagEnum.EnumValue2 : 0;
            result |= LegacyClass.PropC ? FlagEnum.EnumValue3 : 0;
        }
    }
}

Invece di usare il branching nel tuo codice puoi fare aritmetica bit per bit combinata con una piccola funzione per semplificare il codice:

T GetFlag<T>(Boolean value, T flag) {
  return value ? flag : default(T);
}

Per calcolare il valore enum puoi usare questa espressione:

var flagEnum = GetFlag(legacyClass.PropA, FlagEnum.EnumValue1)
  | GetFlag(legacyClass.PropB, FlagEnum.EnumValue2)
  | GetFlag(legacyClass.PropC, FlagEnum.EnumValue3);

Nota che il tuo codice genererà un ArgumentException se nessuno dei flag è impostato. Questo codice calcolerà invece default(FlagEnum) che in questo caso è 0.


Che ne dici di questo?

public DtoClass(LegacyClass legacyClass)
{
    if (!legacyClass.PropA && !legacyClass.PropB && !legacyClass.PropC)
    {
        throw new ArgumentException();
    }
    FlagEnum =  ((legacyClass.PropA) ? FlagEnum.EnumValue1 : FlagEnum)
        | ((legacyClass.PropB) ? FlagEnum.EnumValue2 : FlagEnum)
        | ((legacyClass.PropC) ? FlagEnum.EnumValue3 : FlagEnum);
}