سؤال

على سبيل المثال في .NET App.Config قد تحصل عليه

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

يبدو أن التوقيع في الجزء النوع موحد في مجموعة متنوعة من أماكن .NET ، لكن ليس لدي أي فكرة عن كيفية القيام بذلك في برامجي الخاصة. لقد استخدمت System.Activator في برامجي ولكن هذا يبدو وكأنه تكرار العمل الذي يقوم به .NET بالفعل.

في شروط البرمجة كيف أفعل هذا:

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}
هل كانت مفيدة؟

المحلول

يمكنك الاتصال Type.GetType طريقة للحصول على Type كائن مع الاسم المعطى (المؤهل للتجميع).

يمكنك الاتصال Activator.CreateInstance طريقة لإنشاء مثيل من النوع. (على افتراض أن النوع له مُنشئ افتراضي عام ، أو أنك تعرف حجج المنشئ التي يتطلبها).

فمثلا:

Activator.CreateInstance(Type.GetType(name));

نصائح أخرى

عادة ما يتم إنشاء/الوصول إلى هذه الأقسام مع مصمم إعدادات Visual Studio.

في الحلول ، ابحث ضمن الخصائص-> الإعدادات.

عادةً ما يستخدم اسم النوع الكامل للقيام بربط "متأخر" بنوع معين. في مثال ملف التكوين لديك ، لم يكن نوع قسم التكوين الفعلي معروفًا في وقت إنشاء CLR ، وبالتالي ConfigurationManager يجب أن تقرأ نموذج النوع الفعلي لملف التكوين ولا يتمتع به في وقت التشغيل. يتم ذلك باستخدام System.Activator الفصل ، كما ذكرت ، وهي الطريقة المعتادة للقيام بذلك عبر عالم .NET.

بالطبع ، إذا كان النوع الذي تريد إنشاء مثيله معروفًا في وقت الإنشاء ، فيجب عليك فقط الرجوع إلى التجميع الذي يحتوي عليه واستخدامه new. ومع ذلك ، إذا كنت ترغب في تنفيذ قابلية وقت التشغيل مثل ConfigurationManager, ، يجب عليك استخدام Activator CreateInstance أو CreateInstanceFrom الأساليب ، التي تتجاوزك تتيح لك تمرير السلسلة الدقيقة كما هي القراءة من أي تكوين تستخدمه ، أو مثيل Type, ، والتي يمكن أن يتم إنشاؤها أيضا من نفس السلسلة.

وبالطبع ، هناك الجانب الآخر ، حيث يحتاج أي تطبيق لنقطة التوسيع الخاصة بك إلى كتابة اسم النوع الكامل. للقيام بذلك ، يمكنك استخدام typeof(MyType).FullName, ، أو myInstance.GetType().FullName.

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