-
Notifications
You must be signed in to change notification settings - Fork 1
Enum Extensions
Shmellyorc edited this page Aug 31, 2026
·
1 revision
EnumExtensions provides extension methods for bitwise operations on flag-based enumerations, allowing for intuitive flag manipulation without explicit casting.
| Feature | Description |
|---|---|
| Set Flag | Add a flag to an enum value |
| Clear Flag | Remove a flag from an enum value |
| Toggle Flag | Toggle a flag on an enum value |
| Has All | Check if all specified flags are set |
| Has Any | Check if any specified flag is set |
| Has Only | Check if exactly one flag is set |
| Has None | Check if no flags are set |
Adds a flag to an enum value.
[Flags]
public enum MyFlags
{
None = 0,
Option1 = 1 << 0,
Option2 = 1 << 1,
Option3 = 1 << 2
}
var flags = MyFlags.Option1;
flags = flags.SetFlag(MyFlags.Option2);
// Result: Option1 | Option2Removes a flag from an enum value.
var flags = MyFlags.Option1 | MyFlags.Option2;
flags = flags.ClearFlag(MyFlags.Option1);
// Result: Option2Toggles a flag on an enum value.
var flags = MyFlags.Option1;
flags = flags.ToggleFlag(MyFlags.Option2);
// Result: Option1 | Option2
flags = flags.ToggleFlag(MyFlags.Option2);
// Result: Option1Determines whether all specified flags are set.
var flags = MyFlags.Option1 | MyFlags.Option2;
bool hasAll = flags.HasAllFlags(MyFlags.Option1 | MyFlags.Option2);
// Returns: true
bool hasAll2 = flags.HasAllFlags(MyFlags.Option1 | MyFlags.Option3);
// Returns: falseDetermines whether any of the specified flags are set.
var flags = MyFlags.Option1;
bool hasAny = flags.HasAnyFlag(MyFlags.Option1 | MyFlags.Option2);
// Returns: true
bool hasAny2 = flags.HasAnyFlag(MyFlags.Option2 | MyFlags.Option3);
// Returns: falseDetermines whether exactly one specific flag is set.
var flags = MyFlags.Option1;
bool hasOnly = flags.HasOnlyFlag(MyFlags.Option1);
// Returns: true
bool hasOnly2 = flags.HasOnlyFlag(MyFlags.Option2);
// Returns: falseDetermines whether no flags are set (value is zero).
var flags = MyFlags.None;
bool hasNone = flags.HasNoFlags(); // Returns: true
flags = MyFlags.Option1;
bool hasNone2 = flags.HasNoFlags(); // Returns: false[Flags]
public enum GameState
{
None = 0,
Playing = 1 << 0,
Paused = 1 << 1,
Dialog = 1 << 2,
Menu = 1 << 3,
Loading = 1 << 4
}
private GameState _state;
public void EnterDialog()
{
// While in dialog, game is paused
_state = _state.SetFlag(GameState.Dialog);
_state = _state.SetFlag(GameState.Paused);
}
public void ExitDialog()
{
// Exit dialog, resume game
_state = _state.ClearFlag(GameState.Dialog);
_state = _state.ClearFlag(GameState.Paused);
}
public bool IsInGame()
{
return _state.HasAnyFlag(GameState.Playing | GameState.Paused | GameState.Dialog);
}[Flags]
public enum CharacterEffects
{
None = 0,
Poisoned = 1 << 0,
Burning = 1 << 1,
Frozen = 1 << 2,
Slowed = 1 << 3,
Hasted = 1 << 4,
Shielded = 1 << 5
}
private CharacterEffects _effects;
public void ApplyEffect(CharacterEffects effect)
{
_effects = _effects.SetFlag(effect);
}
public void RemoveEffect(CharacterEffects effect)
{
_effects = _effects.ClearFlag(effect);
}
public void ToggleEffect(CharacterEffects effect)
{
_effects = _effects.ToggleFlag(effect);
}
public bool HasEffect(CharacterEffects effect)
{
return _effects.HasAllFlags(effect);
}
public bool HasAnyEffect()
{
return !_effects.HasNoFlags();
}
public bool IsOnlySlowed()
{
return _effects.HasOnlyFlag(CharacterEffects.Slowed);
}[Flags]
public enum KeyModifiers
{
None = 0,
Shift = 1 << 0,
Control = 1 << 1,
Alt = 1 << 2,
Super = 1 << 3
}
public bool IsKeyDown(KeyboardKey key, KeyModifiers requiredModifiers)
{
var currentModifiers = GetCurrentModifiers();
// Check if all required modifiers are pressed
if (!currentModifiers.HasAllFlags(requiredModifiers))
return false;
// Check if any extra modifiers are pressed (if we want exact match)
// if (!currentModifiers.HasOnlyFlag(requiredModifiers))
// return false;
return SFKeyboard.IsKeyPressed(key);
}[Flags]
public enum CollisionLayer
{
None = 0,
Player = 1 << 0,
Enemy = 1 << 1,
Projectile = 1 << 2,
Terrain = 1 << 3,
Pickup = 1 << 4,
Trigger = 1 << 5
}
public bool CanCollide(CollisionLayer layerA, CollisionLayer layerB)
{
// Check if the two collision layers should interact
var playerCollidesWith = CollisionLayer.Enemy | CollisionLayer.Pickup | CollisionLayer.Trigger;
var enemyCollidesWith = CollisionLayer.Player | CollisionLayer.Projectile | CollisionLayer.Terrain;
if (layerA == CollisionLayer.Player)
return playerCollidesWith.HasAnyFlag(layerB);
if (layerA == CollisionLayer.Enemy)
return enemyCollidesWith.HasAnyFlag(layerB);
return true;
}| Method | Description |
|---|---|
SetFlag |
Adds a flag to an enum value |
ClearFlag |
Removes a flag from an enum value |
ToggleFlag |
Toggles a flag on an enum value |
HasAllFlags |
Checks if all specified flags are set |
HasAnyFlag |
Checks if any specified flag is set |
HasOnlyFlag |
Checks if exactly one flag is set |
HasNoFlags |
Checks if no flags are set |
- MathHelper
- FileHelper
- HashHelper
- JsonHelper
- MapHelper
- TextHelper
- SoundHelper
- AlignHelpers
- Instance Helper
- Enum Extensions
- String Extensions
- Int Extensions
- Float Extensions
- IEnumerable Extensions
- Random Extensions
- Sound Extensions
- Font Extensions