كيفية تحويل سلسلة نصية إلى enum في C#: من المبتدئ إلى المحترف
كل مطور C# يواجه عاجلاً أم آجلاً موقفاً يحتاج فيه إلى تحويل سلسلة نصية عادية إلى تعداد (enum). تحصل على بيانات من JSON، أو تقرأ إعدادات من ملف تهيئة، أو تستقبل أمراً من مستخدم - وتجد أمامك سلسلة نصية بينما الكود ينتظر enum. بدون تحويل صحيح، فإنك تخاطر بالحصول على استثناء أو، الأسوأ من ذلك، خطأ غير ملحوظ في المنطق.
في هذه المقالة، سنستعرض تحويل سلسلة نصية إلى enum في C# من الطرق البسيطة إلى التقنيات المتقدمة. ستتعلم كيفية تحليل السلاسل النصية بأمان، ومعالجة الأخطاء، وكتابة كود أنيق. المادة مبنية على أسئلة حقيقية من Stack Overflow - الموضوع حصل على آلاف المشاهدات ليس من قبيل الصدفة.
هيا بنا!
لماذا تحويل سلسلة نصية إلى enum مهمة شائعة
التعدادات في C# هي أداة قوية لإنشاء كود قابل للقراءة وآمن من حيث الأنواع. لكن العالم الخارجي عادة ما يعمل مع السلاسل النصية: واجهات API ترجع "Admin"، المستخدم يدخل "readonly"، قاعدة البيانات تخزن "Pending". لربط هذه العوالم، نحتاج إلى تحويل string إلى enum C#.
لننظر في السيناريوهات النموذجية:
- إلغاء تسلسل JSON - حقل الحالة يأتي كسلسلة نصية
- تحليل وسائط سطر الأوامر
- قراءة الإعدادات من appsettings.json
- معالجة إدخال المستخدم في نماذج الويب
بدون نهج صحيح، ستحصل إما على استثناء أو أخطاء يصعب اكتشافها. دعنا نتعرف على الأدوات المتاحة.
الطريقة الأساسية: Enum.Parse - سريع وبسيط
الطريقة الأكثر شهرة لتحويل سلسلة نصية إلى enum في C# هي طريقة Enum.Parse. وهي موجودة منذ الإصدارات الأولى من .NET ولا تزال مستخدمة بنشاط.
using System;
public enum UserRole{ Admin, Moderator, User, Guest}
class Program{ static void Main() { string input = "Admin"; UserRole role = (UserRole)Enum.Parse(typeof(UserRole), input); Console.WriteLine(role); // الإخراج: Admin }}هنا نقوم بتحويل النتيجة صراحة إلى النوع المطلوب، لأن Enum.Parse يُرجع object. الطريقة حساسة لحالة الأحرف: السلسلة "admin" ستسبب استثناءً. إذا لم تكن متأكداً من حالة الأحرف، أضف المعامل الثالث:
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), input, ignoreCase: true);الآن "admin"، "ADMIN" وحتى "AdMiN" سيتم تحويلها بشكل صحيح. لكن هناك فارق بسيط: إذا كانت السلسلة لا تطابق أي قيمة من enum، ستحصل على ArgumentException. وهذا يعني أن البرنامج سيتعطل.
متى يكون Enum.Parse اختياراً سيئاً
- عندما لا تتحكم في بيانات الإدخال (إدخال المستخدم)
- عندما قد تكون السلسلة null أو فارغة
- عندما تريد تجنب الاستثناءات
لمثل هذه الحالات، تم اختراع Enum.TryParse.
النهج الآمن: Enum.TryParse - بدون استثناءات
Enum.TryParse في C# هو طوق النجاة الخاص بك. فهو لا يرمي استثناءً، بل يُرجع bool: true إذا نجح التحويل، و false في الحالة المعاكسة.
string input = "Moderator";if (Enum.TryParse(input, ignoreCase: true, out UserRole result)){ Console.WriteLine($"الدور: {result}");}else{ Console.WriteLine("تعذر التعرف على الدور");}لاحظ: TryParse هي طريقة عامة (generic)، لذلك لا حاجة لتحويل النتيجة. معامل ignoreCase يعمل بنفس الطريقة كما في Parse. هذه الطريقة مثالية لتحليل enum بأمان في C#.
لكن هناك حجر عثرة: TryParse يعتبر تحليل السلاسل الرقمية ناجحاً. السلسلة "42" سيتم تحويلها إلى قيمة enum ذات المكافئ الرقمي 42، حتى لو لم تكن هذه القيمة موجودة. لتجنب ذلك، أضف