سؤال

واسمحوا لي أن أقدم سيناريو ثم معرفة ما إذا كان أي شخص لديه حل / عمل حول.

ولقد حصلت على مكتبة (DLL) الذي يحتوي على فصول فقط. في مكتبة أخرى، لقد حصلت على واجهات أن الطبقات في أول مكتبة تنفيذ. سوف عملاء مرجع دائما نسخة واحدة فقط من المكتبة التي تحتوي على واجهات (دائما آخر واحد) - وسيتم إجراء إضافات الوحيد لهذه الواجهات (المزيد من واجهات / طرق). أيضا، لن يكون هناك سوى نسخة واحدة من التي واجهات المكتبات - حتى أن العملاء لا تحتاج إلى تحديث المراجع (سيتم تحميل المكتبة واجهات من خلال التفكير - لذلك لا تنطبق قواعد التحقيق المعتادة، يمكننا تحميل فقط ما العميل على وجه التحديد يطلب). سوف المكتبة تنفيذ واجهات لديها إصدارات متعددة العملاء المختلفة تشير في نفس الوقت.

وتحدث هذه المشكلة عندما يكون التجمع العميل يتم الرجوع نسخة قديمة من المكتبة التنفيذ. أنه يخلق كائن من نوع فئة في المكتبة التنفيذ - ثم يمررها إلى التجمع عميل آخر. يستخدم هذا التجمع عميل النسخة الاحدث (وفقط) من مكتبة واجهات ويحاول أن يلقي الكائن تمريرها إليه مع نوع واجهة المناسب. فشل هذا يلقي باستثناء 'System.TypeLoadException: الطريقة X في نوع Y من التجمع Z ليس لديها التنفيذ. كنت أتوقع هذا الاستثناء لأنه في النسخة الجديدة من واجهة (نفس رقم الإصدار - المكتبة القديمة مضروب)، ويعرف طريقة X، ولكن على الرغم من أن الإصدار القديم من الكائن الذي تم تمريره يحتوي الفوقية التي تقول انها تطبق الواجهة المقابلة، و فشل رسم الخرائط على أسلوب واجهة الجديد X لأنه ليس لديه أي التنفيذ في تلك الفئة.

وهكذا، سؤالي هو هذا. هل هناك طريقة لجعل العميل استخدام تلك الواجهة، ولكن فقط يسبب استثناء عندما يتم استدعاء الأسلوب الذي لم يتم تنفيذ على الكائن المشار إليه (وليس الاستثناء التي يتم توليدها عند يلقي الكائن المشار إليه إلى أحدث نوع واجهة)؟

وبالمناسبة - الربط المتأخر ليس خيارا لأننا نريد التحسس / تجميع الوقت نوع التحقق ... أيضا، وأنا أعرف كيفية القيام بذلك مع مؤشرات الدالة وفئات المجمع - كنت مجرد تأمل في الحصول على حل أفضل أن هو أكثر انسجاما مع أنواع. NET العادية.

والشكر - أي مساعدة هي موضع تقدير

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

المحلول

هل يمكن استخدام مجردا (MustInherit) الفئة بدلا من واجهة في المكتبة التي تحتوي على واجهات وتحديد الأساليب والخصائص كما للتجاوز. بهذه الطريقة حتى لو الأساليب ألقى مجرد استثناء لم تنفذ سيكون هناك دائما تنفيذ كل طريقة في المكتبة واجهة. بجعل الطرق للتجاوز بدلا من MustOverride يجب تجنب TypeLoadException.

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