A DynamicMethod
на самом деле не о динамическом вызове метода, а о динамическом построении метода, как при создании полного тела метода во время выполнения.
Если вы хотите вызвать метод, вы можете просто использовать метод Invoke
на MethodInfo
, который у вас уже есть. Что для пустого метода без аргументов просто
var type = this.GetType();
var method = type.GetMethod("OtherMethod");
...
method.Invoke(this, null); // call this.OtherMethod()
Теперь, если вы хотите инкапсулировать это в Delegate
, вы должны использовать
var action = (Action) Delegate.CreateDelegate(typeof(Action), this, "OtherMethod");
action(); // call this.OtherMethod()
Я выбрал Action в качестве типа делегата здесь, но вы можете использовать любой совместимый тип делегата.
Существует несколько перегрузок Delegate.CreateDelegate
, которые могут вам здесь помочь, включая перегрузки, которые принимают MethodInfo
, поэтому вы можете использовать отражение, чтобы получить правильную информацию о методе, и вызов CreateDelegate
, чтобы сделать делегата типа хочешь.
Имейте в виду, что если метод, который вы хотите вызвать, известен во время компиляции, вы можете пропустить весь процесс отражения и позволить компилятору выполнить работу за вас:
Action action = this.OtherMethod; // using a so-called method group
Action action = () => this.OtherMethod(); // using a lambda
Action action = delegate { this.OtherMethod(); } // using an anonymous method