كيفية إنشاء كائن ديناميكي واستدعاء الأسلوب في .NET 3.5

StackOverflow https://stackoverflow.com/questions/483215

سؤال

كيف يبدو الكود الذي من شأنه إنشاء كائن من الفئة:

string myClass = "MyClass";

من النوع المذكور أعلاه، ثم اتصل

string myMethod = "MyMethod";

على هذا الكائن؟

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

المحلول

مثال، ولكن بدون التحقق من الأخطاء:

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 */
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top