كيف يمكنني استخدام سلاسل نوع .NET في برامجي؟
-
01-10-2019 - |
سؤال
على سبيل المثال في .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
.