Action zum Aufrufen einer Methode basiert auf einem String-Wert
-
06-07-2019 - |
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?
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