Frage

Also ich habe folgendes:

public class Singleton
{

  private Singleton(){}

  public static readonly Singleton instance = new Singleton();

  public string DoSomething(){ ... }

  public string DoSomethingElse(){ ... }

}

Mit Reflexion wie kann ich die DoSomething Methode aufrufen?

Ich frage deshalb, weil ich die Methodennamen in XML speichern und dynamisch die Benutzeroberfläche erstellen. Zum Beispiel bin ich der Erstellung dynamisch auf einen Knopf und sagen es welche Methode über Reflektion zu rufen, wenn die Schaltfläche geklickt wird. In einigen Fällen wäre es DoSomething oder in anderen sei es DoSomethingElse sein.

War es hilfreich?

Lösung

Nicht getestet, aber sollte funktionieren ...

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);

Andere Tipps

Great job. Vielen Dank.

Hier ist der gleiche Ansatz mit leichter Modifikation für die Fälle, die man nicht einen Verweis auf die Remote-Baugruppe haben kann. Wir müssen nur grundlegenden Dinge wie die Klasse Fullname (das heißt namespace.classname und der Pfad zur Remote-Montage) kennen.

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);}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top