أحتاج إلى طريقة مساعدة لمقارنة char Enum وchar المعبأ بكائن

StackOverflow https://stackoverflow.com/questions/105609

  •  01-07-2019
  •  | 
  •  

سؤال

لدي التعداد الذي يبدو كما يلي:

public enum TransactionStatus { Open = 'O', Closed = 'C'};

وأنا أقوم بسحب البيانات من قاعدة البيانات باستخدام حرف واحد يشير - لقد خمنت ذلك - إلى ما إذا كانت المعاملة "O" مفتوحة أم أن المعاملة "C" مغلقة.

الآن نظرًا لأن البيانات تخرج من قاعدة البيانات ككائن، فإنني أقضي وقتًا طويلاً في كتابة كود المقارنة.

أفضل ما يمكنني فعله هو أن أكتب:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return ((char)enum_status).ToString() == obj_status.ToString();
}

ومع ذلك، ليس هذا هو تعداد الشخصيات الوحيد الذي يجب أن أتعامل معه، فلدي 5 أو 6 وأكتب نفس الطريقة لهم أمر مزعج على أقل تقدير. من المفترض أن جميع التعدادات ترث من System.Enum ولكن إذا حاولت تعيين ذلك كنوع الإدخال أحصل على أخطاء الترجمة.وهذا أيضًا موجود في .NET 1.1، لذا فإن الأدوية العامة غير واردة.

لقد كنت أعاني من هذا لفترة من الوقت.هل لدى أي شخص طريقة أفضل لكتابة هذه الطريقة؟أيضًا، هل يمكن لأي شخص توضيح التعدادات الكاملة الموروثة من System.Enum ولكنها ليست شيئًا متعدد الأشكال؟

هل كانت مفيدة؟

المحلول

static void Main(string[] args)
{
    object val = 'O';
    Console.WriteLine(EnumEqual(TransactionStatus.Open, val));

    val = 'R';
    Console.WriteLine(EnumEqual(DirectionStatus.Left, val));

    Console.ReadLine();
}

public static bool EnumEqual(Enum e, object boxedValue)
{                        
    return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue));
}

public enum TransactionStatus { Open = 'O', Closed = 'C' };
public enum DirectionStatus { Left = 'L', Right = 'R' };

نصائح أخرى

تعد التعدادات بشكل عام فوضوية في لغة C#، لذلك عند استخدام .NET 2.0، من الشائع تغليف بناء الجملة بأسماء عامة لتجنب الاضطرار إلى كتابة مثل هذه التعليمات البرمجية الخرقاء.

في .NET 1.1، يمكنك القيام بشيء مثل ما يلي، على الرغم من أنه ليس أكثر تنظيمًا من المقتطف الأصلي:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
    return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}

هذا هو نفس مقدار التعليمات البرمجية تقريبًا ولكنك تقوم الآن بإجراء التعداد بدلاً من مقارنة السلسلة.

يمكنك أيضًا استخدام مصحح الأخطاء/الوثائق لمعرفة ما إذا كان obj_status حقًا كائن أو ما إذا كان يمكنك إرساله بأمان إلى سلسلة.

أود أن ألقي نظرة على Enum.Parse.سيسمح لك بتحليل شارك مرة أخرى إلى التعداد الصحيح.أعتقد أنه يعمل على طول الطريق إلى C# 1.0.سيبدو الرمز الخاص بك قليلاً مثل هذا:

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());

إذا كان عليك فقط مقارنة القيم، فيمكنك استخدام شيء مثل:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top