Frage

Gibt es eine Möglichkeit Aktion zu verwenden, um ein Verfahren auf einem String-Wert basiert aufrufen, die den Namen dieser Methode enthält?

War es hilfreich?

Lösung

Action<T> ist nur ein Delegate-Typ, der auf eine bestimmte Methode zeigen könnte. Wenn Sie eine Methode, dessen Name erst zur Laufzeit bekannt ist, nennen wollen, in einem String-Variable gespeichert ist, müssen Sie Reflektion verwenden:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        typeof(Program).InvokeMember(
            nameOfTheMethodToCall, 
            BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static, 
            null, 
            null, 
            null);
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

Wie @ Andrew vorgeschlagen, dass Sie Delegate.CreateDelegate verwenden könnten einen Delegattyp von einem Method zu erstellen:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        var mi = typeof(Program).GetMethod(nameOfTheMethodToCall, BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static);
        var del = (Action)Delegate.CreateDelegate(typeof(Action), mi);
        del();
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

Andere Tipps

Ich glaube nicht, dass Sie wirklich eine Action<T> nur eine ganz normale Methode wollen.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top