تُعدّ القوائم التعدادية (Enums) أداة قيّمة في C# لتمثيل مجموعة من الثوابت المسماة. وغالباً ما ستحتاج إلى تحويل تمثيل سلسلة نصية لقيمة قائمة تعدادية إلى ما يعادلها من القائمة التعدادية. تتناول هذه المقالة تقنيات متنوعة لأداء هذا التحويل بأمان وفعالية.
جدول المحتويات
- استخدام
Enum.Parse()
وEnum.TryParse()
- معالجة الاستثناءات مع
Enum.Parse()
- التحقق من قيم القائمة التعدادية الصالحة مع
Enum.IsDefined()
- أفضل الممارسات والتوصيات
استخدام Enum.Parse()
و Enum.TryParse()
توفر C# طريقتين أساسيتين لتحويل السلاسل النصية إلى قوائم تعدادية: Enum.Parse()
و Enum.TryParse()
. Enum.Parse()
بسيطة، لكنها تطرح استثناءً إذا لم تتطابق السلسلة النصية المدخلة مع قيمة قائمة تعدادية مُعرّفة. Enum.TryParse()
يوفر بديلاً أكثر أماناً، حيث يُعيد قيمة منطقية تشير إلى النجاح أو الفشل.
مثال Enum.Parse()
:
public enum DaysOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
public static DaysOfWeek ParseDay(string dayString)
{
return (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayString, true); //true for ignore case
}
مثال Enum.TryParse()
:
public static bool TryParseDay(string dayString, out DaysOfWeek day)
{
return Enum.TryParse(dayString, true, out day); //true for ignore case
}
Enum.TryParse()
يتجنب الاستثناءات، مما يجعله مُفضّلاً لمعالجة إدخال المستخدم أو البيانات الخارجية حيث من الممكن وجود قيم غير صالحة.
معالجة الاستثناءات مع Enum.Parse()
على الرغم من أن Enum.TryParse()
موصى به، إلا أن فهم معالجة الاستثناءات مع Enum.Parse()
أمر بالغ الأهمية. يمكن لكتلة try-catch
إدارة ArgumentException
المحتملة بشكل أنيق:
public static DaysOfWeek ParseDayWithExceptionHandling(string dayString)
{
try
{
return (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), dayString, true); //true for ignore case
}
catch (ArgumentException ex)
{
Console.WriteLine($"خطأ في تحليل '{dayString}': {ex.Message}");
// تعامل مع الخطأ بشكل مناسب، على سبيل المثال، قم بإرجاع قيمة افتراضية أو أطرح استثناءً مخصصاً.
return DaysOfWeek.Monday; // أو أطرح استثناءً مخصصاً
}
}
التحقق من قيم القائمة التعدادية الصالحة مع Enum.IsDefined()
قبل التحليل، من الحكمة التحقق مما إذا كانت السلسلة النصية المدخلة تتوافق مع قيمة قائمة تعدادية صالحة باستخدام Enum.IsDefined()
. هذا يحسّن من متانة الكود ويمنع الاستثناءات غير الضرورية:
public static bool IsValidDay(string dayString)
{
return Enum.IsDefined(typeof(DaysOfWeek), dayString);
}
أفضل الممارسات والتوصيات
في معظم السيناريوهات، Enum.TryParse()
هو النهج الموصى به نظرًا لطبيعته الآمنة من الاستثناءات. اجمعه مع Enum.IsDefined()
للتحقق المُحسّن قبل التحليل. تعامل دائمًا مع الأخطاء المحتملة بشكل أنيق لبناء تطبيقات قوية وسهلة الاستخدام. ضع في اعتبارك استخدام قيمة افتراضية أو طرح استثناء مخصص لإدارة التحويلات الفاشلة بفعالية.