سؤال

هل هناك طريقة لإنشاء مثيل لفئة بناءً على حقيقة أنني أعرف اسم الفئة في وقت التشغيل.في الأساس سيكون لدي اسم الفصل في سلسلة.

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

المحلول

ونلقي نظرة على Activator.CreateInstance الأسلوب.

نصائح أخرى

انها بسيطة جدا.افترض أن اسم الفصل الخاص بك هو Car ومساحة الاسم هي Vehicles, ، ثم قم بتمرير المعلمة كـ Vehicles.Car الذي يقوم بإرجاع كائن من النوع Car.بهذه الطريقة يمكنك إنشاء أي مثيل لأي فئة ديناميكيًا.

public object GetInstance(string strFullyQualifiedName)
{         
     Type t = Type.GetType(strFullyQualifiedName); 
     return  Activator.CreateInstance(t);         
}

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

public object GetInstance(string strFullyQualifiedName)
{
     Type type = Type.GetType(strFullyQualifiedName);
     if (type != null)
         return Activator.CreateInstance(type);
     foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
     {
         type = asm.GetType(strFullyQualifiedName);
         if (type != null)
             return Activator.CreateInstance(type);
     }
     return null;
 }

الآن إذا كنت تريد الاتصال بـ منشئ المعلمات قم بما يلي

Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type

بدلاً من

Activator.CreateInstance(t);

ولقد استعملت هذه الطريقة بنجاح:

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

وستحتاج للادلاء الكائن عاد إلى ك نوع الكائن المطلوب.

وربما سؤالي كان ينبغي أن يكون أكثر تحديدا. وأنا أعلم في الواقع الفئة الأساسية للسلسلة حتى تحل من قبل:

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

والطبقة Activator.CreateInstance ديها أساليب مختلفة لتحقيق نفس الشيء بطرق مختلفة. كان يمكن أن يطرح للكائن ولكن ما سبق هو من أكثر فائدة للوضعي.

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

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

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

لإنشاء مثيل لفئة من مشروع آخر في الحل، يمكنك الحصول الجمعية تدل عليه اسم أي فئة (على سبيل المثال BaseEntity) وإنشاء مثيل جديد:

  var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

وماذا اردت كتابة رمز مثل هذا؟ إذا كان لديك فئة "ReportClass 'هو متاح، يمكنك مثيل مباشرة كما هو موضح أدناه.

ReportClass report = new ReportClass();

ويستخدم ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); الرمز عندما لم يكن لديك الطبقة اللازمة، ولكن تريد مثيل وأو أو استدعاء أسلوب حيوي.

وأعني أنه من المفيد عندما نعرف ش الجمعية ولكن حين كتابة التعليمات البرمجية التي لا تملك ReportClass الدرجة المتاحة.

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