Если я правильно понимаю, вопрос состоит в том, чтобы вернуть случайное значение перечисления из значения перечисления flags, а не вернуть случайный член из перечисления flags.
[Flags]
private enum Shot
{
Whisky = 1,
Absynthe = 2,
Pochin = 4,
BrainEraser = Whisky | Absynthe | Pochin
}
[Test]
public void Test()
{
Shot myCocktail = Shot.Absynthe | Shot.Whisky;
Shot randomShotInCocktail = GetRandomShotFromCocktail(myCocktail);
}
private static Shot GetRandomShotFromCocktail(Shot cocktail)
{
Random random = new Random();
Shot[] cocktailShots = Enum.GetValues(typeof(Shot)).
Cast<Shot>().
Where(x => cocktail.HasFlag(x)).ToArray();
Shot randomShot = cocktailShots[random.Next(0, cocktailShots.Length)];
return randomShot;
}
Edit
И, очевидно, вы должны проверить, что перечисление является допустимым значением, например:
Shot myCocktail = (Shot)666;
Редактировать
Упрощенный