سؤال

أنا أستخدم (نسخة ممتدة قليلا من) التعليمات البرمجية التالية في وظيفة نمط نمط المصنع:

فئة عامة واحدة: checkoutcontext {booking bookingcontext data {get؛ جلس؛ } العام الوثني (بيانات BookingContext) {Data = البيانات؛ }}} Public Checkouttext FindContext (بيانات BookingContext) {اكتب contexttype = type.gettype ("checkoutprocesses." + data.case.tostring ()؛ إخراج Checkoutcontext = Activator.CreateInstance (ContextType، BindingFlags.createInstance، New [] {Data}) ك CheckoutContext؛ إخراج العودة }

ومع ذلك، فإنه يرمي جستكوتا لم يتم العثور على استثناء عند التشغيل، ولا يمكنني معرفة السبب.

تقوم الأسلوب data.case.tostring () بإرجاع اسم الفصل، والتي تحتوي على منشئ يأخذ حجة واحدة.

هل لدى أي شخص أي فكرة عن المشكلة؟

هتاف، إد.

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

المحلول

جرب هذه:

  Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
  CheckoutContext output = 
      (CheckoutContext)Activator.CreateInstance(contextType, data);

السبب لك رمز لا يعمل هو ذلك Activator.CreateInstance ليس لديك حقا الحمل الزائد الذي تريده. لذلك قد تتساءل لماذا يجمع الكود على الإطلاق! السبب هو، لديه الحمل الزائد الذي يأخذ (Type type, params object[] args) الذي يطابق دعوة طريقتك بحيث يتم تجميعها ولكن في وقت التشغيل، يبحث عن النوع الخاص بك للحصول على منشئ يأخذ BindingFlags و BookingContext[] وهو من الواضح أنه ليس ما يحتوي عليه نوعك.

نصائح أخرى

هل المنشئ الجمهور؟

هو المعلمة واحدة من النوع BookingContext?

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

هل يقوم المنشئ الفردي باستخدام BookingContext كمعلمة؟ إذا لم تتطابق مع exatcly، فسوف تفشل:

class ParamType   {    }
class DerivedParamType : ParamType    {    }
class TypeToCreate
{
    public TypeToCreate(DerivedParamType data)
    {
        // do something
    }
}

ParamType args = new ParamType();
// this call will fail: "constructor not found"
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

// this call would work, since the input type matches the constructor
DerivedParamType args = new DerivedParamType();
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

هذا عملت بالنسبة لي.

Type.getType ("اسم الاسم. مكمل واسم مساحة الاسم)؛

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