سؤال

سؤال:
هل هناك طريقة ثابتة لتحديد النوع الذي يحتوي عليه النوع المشتق منه بشكل موثوق CollectionBase, باستخدام الانعكاس أو Microsoft.Cci؟

خلفية:
أنا أعمل على منشئ الأكواد الذي ينسخ الأنواع، ويصنع إصدارات مخصصة من تلك الأنواع، ويجري محولات بينها.فهو يتنقل بين الأنواع الموجودة في التجميع المصدر عبر Microsoft.Cci.يقوم بطباعة كود المصدر باستخدام قوالب نصية.إنه يقوم بالكثير من التحويل والتخصيص، ويتخلص من التعليمات البرمجية التي لا أهتم بها.

في الكود الناتج، أنوي الاستبدال List<T> في كل مكان أن أ CollectionBase, IEnumerable<T>, ، أو T[] تم استخدامه سابقًا.أريد أن استخدام List<T> لأنني متأكد تمامًا من أنه يمكنني إجراء تسلسل له دون عمل إضافي، وهو أمر مهم بالنسبة لطلبي. T ملموسة في كل حالة.أحاول عدم النسخ CollectionBase الفئات لأنني سأضطر إلى نسخ التنفيذ المخصص، وأريد تجنب الاضطرار إلى القيام بذلك في منشئ التعليمات البرمجية الخاص بي.

الجزء الوحيد الذي أواجه مشكلة فيه هو التحديد T ل List<T> عند استبدال العرف CollectionBase.

ما قمت به حتى الآن:
لقد ألقيت نظرة سريعة على مستندات وعينات MSDN لـ CollectionBase, ، ويذكرون خلق العرف Add الطريقة على النوع المشتق الخاص بك.لا أعتقد أنه تم تطبيق هذا بأي شكل من الأشكال، لذلك لست متأكدًا من أنني أستطيع الاعتماد على ذلك.يمكن للمنفذ أن يطلق عليه اسمًا آخر، أو ما هو أسوأ من ذلك، أن يكون لديه مجموعة تدعم أنواعًا متعددة، مع Object باعتباره الجد المشترك الوحيد لهم.

البدائل التي فكرت فيها:
ربما يقوم التسلسل الافتراضي ببعض الحيل التي يمكنني الاستفادة منها.هل هناك تسلسل افتراضي لـ CollectionBase المجموعات، أو هل يتعين عليك بشكل عام تنفيذها بنفسك؟إذا كان عليك القيام بذلك بنفسك، فهل هناك بعض البيانات الوصفية الموثوقة التي يمكنني الاطلاع عليها لتحديد الأنواع؟إذا كان يدعم التسلسل الافتراضي، فهل يعتمد على أنواع وقت التشغيل للعناصر الموجودة في المجموعة؟

يمكنني إجراء تعيين في منشئ الكود الخاص بي المعروف CollectionBase أنواع، المعينة إلى المقابلة لها T ل List<T>.إذا معين CollectionBase النوع الذي أواجهه غير موجود في القائمة، قم بطرح استثناء.ربما هذا هو ما سأختاره إذا لم يكن هناك بديل موثوق.

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

المحلول

ما زلت غير متأكد بما فيه الكفاية بشأن ما تريد القيام به لتقديم المشورة.ومع ذلك، هل تقوم جميع الفئات المشتقة من CollectionBase بتنفيذ Add(T)؟إذا كان الأمر كذلك، فيمكنك البحث عن طريقة Add بمعلمة واحدة من نوع آخر غير الكائن، واستخدام هذا النوع لـ T.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top