2014-10-14 7 views
2

Скажем, у меня есть флаг перечислимую:Как вы проверяете комбинацию флагов перечисления?

[Flags] 
public enum ColorType 
{ 
    None = 0, 
    Red = 1 << 0, 
    White = 1<<1, 
    Yellow = 1 << 2, 
    Blue = 1 << 3, 
    All = Red | White | Yellow | Blue 
} 

У меня есть ниже функции, какой параметр является комбинацией флага, таких как DoSomething (ColorType.Blue | ColorType.Yellow).

public void DoSomethingr(ColorType theColorTypes) 
{ 
     if (theColorTypes.HasFlag(All)) Foo1(); 
     if (theColorTypes.HasFlag(White) && theColorTypes.HasFlag(Red)) Foo2(); 
     if (!theColorTypes.HasFlag(Blue)) Foo3(); 
     . . . 
} 

Есть ли простой способ проверить всю возможную побитовую комбинацию флагов?

[Test] 
public void Test1(ColorType.Red | ColorType.Yellow | ColorType.White) 

[Test] 
public void Test1(ColorType.Red | ColorType.Yellow | ColorType.white | ColorType.Blue) 

Благодаря

+2

Какой смысл теста? Проверить, работает ли атрибут 'Flags'? –

ответ

0

перебираем все возможные значения и положить его в TestCaseSource создать другой тест для каждого значения перечисления:

public IEnumerable<ColorType> TestCaseSource 
{ 
    get 
    { 
     int start = (int)ColorType.None; 
     int count = (int)ColorType.All - start + 1; 
     return Enumerable.Range(start, count).Select(i => (ColorType)i); 
    } 
} 

[TestCaseSource("TestCaseSource")] 
public void Test1(ColorType colorType) 
{ 
    // whatever your test is 
} 
0

Просто мои два цента, и это, вероятно, может быть улучшено, чтобы принимать другие типы значений, но в качестве альтернативы, когда вам нравятся методы расширения:

public static class EnumExtensions 
{ 
    public static bool HasFlags<TEnum>(this TEnum @enum, 
             TEnum flag, 
             params TEnum[] flags) 
     where TEnum : struct 
    { 
     var type = typeof(TEnum); 
     if (!type.IsEnum) 
      throw new ArgumentException("@enum is not an Enum"); 

     var hasFlagsMethod = type.GetMethod("HasFlag"); 
     var hasFlag = new Func<TEnum, bool>(e => 
     { 
      return (bool)hasFlagsMethod.Invoke(@enum, new object[] { e }); 
     }); 

     // test the first flag argument 
     if (!hasFlag(flag)) 
      return false; 

     // test the params flags argument 
     foreach (var flagValue in flags) 
     { 
      if (!hasFlag(flagValue)) 
       return false; 
     } 
     return true; 
    } 
} 


[Flags] 
public enum ColorType 
{ 
    None = 0, 
    Red = 1 << 0, 
    White = 1 << 1, 
    Yellow = 1 << 2, 
    Blue = 1 << 3, 
    All = Red | White | Yellow | Blue 
} 

Зов это следующим образом:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var color = ColorType.Red; 
     Console.WriteLine(color.HasFlags(ColorType.Red)); // true; 
     Console.WriteLine(color.HasFlags(ColorType.Red, ColorType.Blue)); // false; 

     color = ColorType.All; 
     Console.WriteLine(color.HasFlags(ColorType.Red, ColorType.Blue)); // true; 

     Console.ReadLine(); 
    } 
} 
Смежные вопросы