استدعاء أسلوب باستخدام انعكاس على كائن مفرد

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

  •  03-07-2019
  •  | 
  •  

سؤال

ولذا فإن لدي ما يلي:

public class Singleton
{

  private Singleton(){}

  public static readonly Singleton instance = new Singleton();

  public string DoSomething(){ ... }

  public string DoSomethingElse(){ ... }

}

وعن طريق التفكير كيف يمكنني استدعاء أسلوب تنفيذ DoSomething؟

والسبب ما أطلبه هو لأنني تخزين أسماء أسلوب في XML وحيوي إنشاء واجهة المستخدم. على سبيل المثال أنا خلق ديناميكية على زر وتشرح أنه ما طريقة للاتصال عن طريق التفكير عند النقر على زر. في بعض الحالات، سيكون تنفيذ DoSomething أو في غيرها سيكون DoSomethingElse.

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

المحلول

وغير مختبر، ولكن يجب أن تعمل ...

string methodName = "DoSomething"; // e.g. read from XML
MethodInfo method = typeof(Singleton).GetMethod(methodName);
FieldInfo field = typeof(Singleton).GetField("instance",
    BindingFlags.Static | BindingFlags.Public);
object instance = field.GetValue(null);
method.Invoke(instance, Type.EmptyTypes);

نصائح أخرى

وعملا عظيما. شكر.

وهنا نفس النهج مع تعديل طفيف للحالات التي لا يمكن للمرء أن يكون إشارة إلى التجمع بعد. نحن فقط بحاجة الى معرفة الأشياء الأساسية مثل FULLNAME الطبقة (أي namespace.classname والمسار إلى التجمع بعد).

static void Main(string[] args)
    {
        Assembly asm = null;
        string assemblyPath = @"C:\works\...\StaticMembers.dll" 
        string classFullname = "StaticMembers.MySingleton";
        string doSomethingMethodName = "DoSomething";
        string doSomethingElseMethodName = "DoSomethingElse";

        asm = Assembly.LoadFrom(assemblyPath);
        if (asm == null)
           throw new FileNotFoundException();


        Type[] types = asm.GetTypes();
        Type theSingletonType = null;
        foreach(Type ty in types)
        {
            if (ty.FullName.Equals(classFullname))
            {
                theSingletonType = ty;
                break;
            }
        }
        if (theSingletonType == null)
        {
            Console.WriteLine("Type was not found!");
            return;
        }
        MethodInfo doSomethingMethodInfo = 
                    theSingletonType.GetMethod(doSomethingMethodName );


        FieldInfo field = theSingletonType.GetField("instance", 
                           BindingFlags.Static | BindingFlags.Public);

        object instance = field.GetValue(null);

        string msg = (string)doSomethingMethodInfo.Invoke(instance, Type.EmptyTypes);

        Console.WriteLine(msg);

        MethodInfo somethingElse  = theSingletonType.GetMethod(
                                       doSomethingElseMethodName );
        msg = (string)doSomethingElse.Invoke(instance, Type.EmptyTypes);
        Console.WriteLine(msg);}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top