سؤال

كيف يمكنني تحديد ما إذا كان أ Nullable(of Enum) هو في الواقع Enum عن طريق التفكير؟

أنا أعمل بطريقة تملأ ديناميكيًا كائن من النوع T مع ال IDataReader تم الاسترجاع من مكالمة قاعدة البيانات. في جوهرها ، يحلق من خلال مراسيم DataReader ، وجميع خصائص T وتملأ الخصائص التي تتطابق مع اسم المراسيم (كما يتم إلقاء بعض سحر السمات لتغيير أسماء الأعمدة). في كل الظروف الأخرى ، يعمل بشكل رائع ، لكن عندما أتحقق من العقار BaseType إلى عن على System.Enum أجد بدلا من ذلك ، System.ValueType وبالتالي ، فإن فحص التعداد الخاص بي يفشل والقنابل الطريقة.

يحرر:Type.IsEnum لا يعمل كيف أحتاجها. القضية الرئيسية هنا ، هي أن لا شيء في Tيقول التسلسل الهرمي لـ BaseType إنه أمر Enum. يبدو الأمر كما لو جعلها أ Nullable اكتب مصادرة بلدي Enum حقوق.

أيه أفكار؟

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

المحلول

إنها مرهقة بعض الشيء:

  • احصل على الكتابة من PropertyInfo.PropertyType
  • اختبار ل IsGenericType
  • إذا كان الأمر كذلك ، احصل على النوع العام مع GetGenericTypeDefinition()
  • إذا كان هذا النوع يساوي typeof(Nullable<>), ، لديك باطل
  • احصل على الأساس (أي Enum) اكتب مع Nullable.GetUnderlyingType(propertyInfo.PropertyType)

نصائح أخرى

سؤالك غير واضح. يمكنك استخدام .HasValue لإيجاد ما إذا كان Nullable يحتوي على تعداد أو أنه لاغية ولكن هذا لا يبدو أنه الغرض من سؤالك. هل تستخدم الانعكاس للحصول على نوع المتغير وإلقاء بيانات Idatareader من كائن إلى هذا النوع؟

هل يعود العمود الذي يعود من idatareader دائمًا؟ إذا كان الأمر كذلك ، فقد تكون هناك طريقة بسيطة للتحقق:

AnEnum? enumObj;
if (enumObj.HasValue)
{
  enumObj.Value.GetType().IsEnum();
}

امل ان يساعد.

أشعر أيضًا أن السؤال ليس واضحًا تمامًا. لقد استخدمت خدعة Oregonghost في رمز الإنتاج لدينا. من الجيد عندما تكون قائمة التعدادات صغيرة ، ولكن يمكن أن تصبح بطيئة مع نمو التسلسل الهرمي (اقرأ ما يتجاوز 100 إدخالات).

أود أيضًا استخدام تسلسل قيمة التعداد عندما يكون هناك مفهوم يمتد فئات متعددة في التسلسل الهرمي للميراث (مثل التعدادات التي تمثل الحقول/الخصائص في الفصل):

class Base
{
  enum BaseEnum
  {
   Val1,
   Val2,
   LastVal
  }
}

class Derived
{
  enum DerivedEnum
  {
    Val3 = BaseEnum.LastVal,
    Val4,
    LastVal
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top