.NET كائنات ديناميكية مع انعكاس
-
08-07-2019 - |
سؤال
كيف يمكنني تحديد ما إذا كان أ 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
}
}