سؤال

لدي مجموعة من العقد الفرعية لـ MDI التي تم إنشاؤها جميعًا بنفس الطريقة ولتقليل التعليمات البرمجية الزائدة عن الحاجة، أود أن أكون قادرًا على استدعاء طريقة، وتمريرها سلسلة (اسم العقدة الفرعية)، وجعلها تنشئ العقدة و إضافته إلى الوالدين.

يمكنني القيام بكل الأشياء باستثناء إنشاء الفصل من سلسلة من اسم الفصل، كيف يمكنني القيام بذلك؟

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

المحلول

أستخدم هذا حاليًا في أحد تطبيقاتي لإنشاء فصل دراسي جديد

public static IMobileAdapter CreateAdapter(Type AdapterType)
{
  return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}

إنها تقوم بإرجاع مثيل لفئة تطبق IMobileAdapter، ولكن يمكنك استخدامه بسهولة مع سلسلة:

public static IMyClassInterface CreateClass(string MyClassType)
{
  return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}

نسميها باستخدام رمز مشابه لما يلي:

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");

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

يحرر:

بالإشارة إلى تعليقك، ولأغراض هذه المناقشة، فكر في مصطلح "التجميع" باعتباره مجموعة الملفات الموجودة داخل مشروع vb/cs الخاص بك.أفترض أنك تفعل كل هذا ضمن مشروع واحد [تجميع] ولا تتوزع على مشاريع متعددة.

في حالتك حيث ستقوم فئاتك بتوسيع كائن النموذج، ستفعل شيئًا كهذا.

Form myInst = CreateClass("MyExtendedForm");

أو

Form myInst = CreateClass(Type.GetType("MyExtendedForm"));

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

class MyCustomForm : Form
{
    public int myCustomField{ get; set; }
}

لقد حصلت على نموذج مخصص يمتد إلى النموذج بإضافة خاصية myCustomField.أريد إنشاء مثيل لذلك باستخدام Activator.CreateInstance():

public static Form CreateClass(string InstanceName)
{
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}

ثم أسميها باستخدام:

Form myInst = CreateClass("MyCustomForm");

والآن لدي النموذج المخصص الخاص بي مخزّنًا في myInst.ومع ذلك، للوصول إلى الخاصية المخصصة [myCustomField]، ستحتاج إلى إرسال المثيل الخاص بك إلى النموذج الصحيح:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;

نصائح أخرى

Activator.CreateInstance(Type.GetType(typeName))

إذا كان لديك سلسلة وهو اسم الفئة، ثم عليك أن تكون قادرا على الحصول على كائن نوع منها، من خلال الدعوة Type.GetType (سلسلة). من هذا النوع، يجب أن تكون قادرا على استخدام انعكاس لتوليد كائن.

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