كيفية إنشاء كائن ديناميكي واستدعاء الأسلوب في .NET 3.5
-
20-08-2019 - |
سؤال
كيف يبدو الكود الذي من شأنه إنشاء كائن من الفئة:
string myClass = "MyClass";
من النوع المذكور أعلاه، ثم اتصل
string myMethod = "MyMethod";
على هذا الكائن؟
المحلول
- يستخدم
Type.GetType(string)
للحصول على كائن النوع. - يستخدم
Activator.CreateInstance(Type)
لإنشاء مثيل. - يستخدم
Type.GetMethod(string)
لاسترجاع الطريقة. - يستخدم
MethodBase.Invoke(object, object[])
لاستدعاء الأسلوب على الكائن
مثال، ولكن بدون التحقق من الأخطاء:
using System;
using System.Reflection;
namespace Foo
{
class Test
{
static void Main()
{
Type type = Type.GetType("Foo.MyClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("MyMethod");
method.Invoke(instance, null);
}
}
class MyClass
{
public void MyMethod()
{
Console.WriteLine("In MyClass.MyMethod");
}
}
}
تحتاج كل خطوة إلى فحص دقيق - قد لا تجد النوع، وقد لا يحتوي على مُنشئ بدون معلمات، وقد لا تجد الطريقة، وقد تستدعيه باستخدام أنواع وسيطات خاطئة.
شيء واحد يجب ملاحظته:يحتاج Type.GetType(string) إلى اسم النوع المؤهل للتجميع ما لم يكن موجودًا في التجميع الذي يتم تنفيذه حاليًا أو mscorlib.
نصائح أخرى
ولقد خلق المكتبة التي يبسط إنشاء كائن ديناميكي والاحتجاج باستخدام .NET يمكنك تحميل المكتبة ورمز في مدونة جوجل: <لأ href = "http://code.google.com/p/latebindinghelper/ "يختلط =" noreferrer نوفولو "> الربط المتأخر مساعد في المشروع سوف تجد rel="nofollow صفحة ويكي مع استخدام و أو يمكنك أيضا التحقق من هذا في CodeProject
وعن طريق مكتبتي، والمثال الخاص بك تبدو هذه:
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();
وأو حتى أقصر:
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
.Method("MyMethod")
.Invoke();
ويستخدم واجهة بطلاقة، ويبسط حقا هذا النوع من العمليات. أرجو أن تجد أنه من المفيد.
وفيما يلي يفترض كائن مع منشئ العام وطريقة العامة التي تقوم بإرجاع قيمة بعض ولكن لا يأخذ المعلمات.
var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
وعلى افتراض أن الطبقة الخاصة بك في التجمع تنفيذ الخاص بك، منشئ وطريقة الخاص بك هو parameterless.
Type clazz = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyClass");
System.Reflection.ConstructorInfo ci = clazz.GetConstructor(new Type[] { });
object instance = ci.Invoke(null); /* Send parameters instead of null here */
System.Reflection.MethodInfo mi = clazz.GetMethod("MyMethod");
mi.Invoke(instance, null); /* Send parameters instead of null here */