إنشاء مثيل لفئة من سلسلة
-
03-07-2019 - |
سؤال
هل هناك طريقة لإنشاء مثيل لفئة بناءً على حقيقة أنني أعرف اسم الفئة في وقت التشغيل.في الأساس سيكون لدي اسم الفصل في سلسلة.
المحلول
ونلقي نظرة على 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
الدرجة المتاحة.