using System; namespace XRLib.Util { public static class EnumExtension { public static void AddFlag(this ref TEnum currentValue, TEnum flagToAdd) where TEnum : struct, Enum { // currentValue¿Í flagToAdd°¡ °°Àº Enum ŸÀÔÀÎÁö È®ÀÎÇÕ´Ï´Ù. if (!typeof(TEnum).IsEnum) { throw new ArgumentException("TEnum must be an enumerated type."); } // currentValue¿Í flagToAdd¸¦ ¼ýÀÚÇü½ÄÀ¸·Î º¯È¯ÇÑ ÈÄ OR ¿¬»êÇÕ´Ï´Ù. int currentValueInt = Convert.ToInt32(currentValue); int flagToAddInt = Convert.ToInt32(flagToAdd); int resultInt = currentValueInt | flagToAddInt; // OR ¿¬»ê °á°ú¸¦ Enum ŸÀÔÀ¸·Î º¯È¯ÇÏ¿© currentValue ¸Å°³º¯¼ö¿¡ ÇÒ´çÇÕ´Ï´Ù. currentValue = (TEnum)Enum.ToObject(typeof(TEnum), resultInt); } public static void RemoveFlag(this ref TEnum currentValue, TEnum flagToAdd) where TEnum : struct, Enum { // currentValue¿Í flagToAdd°¡ °°Àº Enum ŸÀÔÀÎÁö È®ÀÎÇÕ´Ï´Ù. if (!typeof(TEnum).IsEnum) { throw new ArgumentException("TEnum must be an enumerated type."); } // currentValue¿Í flagToAdd¸¦ ¼ýÀÚÇü½ÄÀ¸·Î º¯È¯ÇÑ ÈÄ OR ¿¬»êÇÕ´Ï´Ù. int currentValueInt = Convert.ToInt32(currentValue); int flagToAddInt = Convert.ToInt32(flagToAdd); int resultInt = currentValueInt & ~flagToAddInt; // OR ¿¬»ê °á°ú¸¦ Enum ŸÀÔÀ¸·Î º¯È¯ÇÏ¿© currentValue ¸Å°³º¯¼ö¿¡ ÇÒ´çÇÕ´Ï´Ù. currentValue = (TEnum)Enum.ToObject(typeof(TEnum), resultInt); } public static bool StringToEnum(string value, out T result) { result = default; if (!Enum.TryParse(typeof(T), value, out var parse)) return false; result = (T)parse; return true; } } }