Ответ 1
Я думаю, ты немного задумываешься о вещах. Итак, начните с вершины:
-
Лямбда-выражение является обозначением для ссылки на выполнение метода. Пример:
x => x + 3
На самом базовом уровне это представляет собой функцию, которая принимает 1 вход,
x
, а затем возвращает значение, равноеx + 3
. Итак, в вашей ситуации ваше выражение:() => DoSomething(15, "Something")
Представляет метод, который принимает 0 параметров, а затем вызывает метод
DoSomething(15, "Something")
. Компилятор за кулисами, переводящий это в делегатFunc
илиAction
для вас. Так оно и есть:new Action(delegate() { DoSomething(15, "Something") });
Переписывание компилятора моего простого выражения выше:
new Func<int, int>(delegate(int x) { return x + 3; });
-
Далее, если вы хотите вызвать действие позже, синтаксис для этого достаточно прост:
Action someMethod = new Action(() => { Console.WriteLine("hello world"); })); someMethod(); // Invokes the delegate
Итак, если у вас есть данный экземпляр
Action
, просто вызывать его с помощью синтаксиса()
- это все, что вам нужно, посколькуAction
- это делегат, который принимает 0 параметров и ничего не возвращает.Функция аналогично проста:
Func<int, int> previousGuy = x => x + 3; var result = previousGuy(3); // result is 6
-
Наконец, если вы хотите передать метод для вызова, и у вас нет контекста для параметров в этой точке, вы можете просто обернуть свой вызов в действие и вызвать его позже. Например:
var myAction = new Action(() => { // Some Complex Logic DoSomething(15, "Something"); // More Complex Logic, etc }); InvokeLater(myAction); public void InvokeLater(Action action) { action(); }
Все данные фиксируются при закрытии вашего метода и, таким образом, сохраняются. Поэтому, если вам удастся пройти через
Action
к вашему событию с помощью свойстваe.Argument
, все, что вам нужно будет сделать, это вызвать(e.Argument as Action)()
.