tutorialspoint - set get c#




كيفية جعل الكائنات بشكل صحيح التي تم إنشاؤها من خلال التفكير (5)

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

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

حاولت هذا الرمز ولكن لم أستطع أن يلقي كائن س كما كنت أتوقع. أنا صعدت من خلال عملية مع المصحح وكان يسمى البناء السليم. كيكواتشينغ كائن س أظهرت لي أنه كان الحقول والخصائص التي كنت أتوقع أن نرى في فئة التنفيذ.

loop through assemblies
  loop through types in assembly
    // Filter out unwanted types
    if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
      continue;
    // This successfully created the right object
    object o = Activator.CreateInstance(type);
    // This threw an Invalid Cast Exception or returned null for an "as" cast
    // even though the object implemented IPlugin      
    IPlugin i = (IPlugin) o;

أنا جعلت رمز العمل مع هذا.

using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();

في ما يلي أسئلتي:

  1. Activator.CreateInstance (تايب t) بإرجاع كائن، ولكن لم أستطع إرسال الكائن إلى واجهة تنفيذ الكائن. لماذا ا؟
  2. هل يجب أن أستخدم عبئا مختلفا من كراتينستانس ()؟
  3. ما هي النصائح والحيل المتعلقة بالتفكير؟
  4. هل هناك جزء مهم من التفكير الذي لا أحصل عليه؟

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

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


هل نوعك غير عام، إذا كان الأمر كذلك، استدعاء الزائد الذي يأخذ في منطقية:

Activator.CreateInstance(type, true);

أيضا، في المثال الأول الخاص بك، معرفة ما إذا كان هو فارغ و إن لم يكن، طباعة o.GetType () اسم لمعرفة ما هو عليه حقا.



الارتباط إلى إغيد أعلاه هو الحل الرئيسي للمشكلة استخدام Assembly.LoadFile () بدلا من .LoadFrom ()


@ هاكيد

حاولت أن أبقي على بسيودوكود بسيطة. فوريش's تأخذ الكثير من الفضاء والأقواس. أوضحت ذلك.

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





reflection