Я пытаюсь создать собственный понятный пример того, что делает метод RelayCommand в следующем коде:
return new RelayCommand(p => MessageBox.Show("It worked."));
конструктор это:
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
В мой последний вопрос Джон Скит указал мне правильное направление, чтобы я мог получить пример (ниже), который делает то, что я хотел (передать имя некоторого метода, как в MessageBox.Show выше). Но проблема в том, чтобы заставить его работать, мне пришлось убрать весь лямбда-синтаксис (действие, предикат и т. Д.), И это то, что я пытаюсь понять.
Есть ли способ изменить рабочий пример, чтобы он выполнял ту же функцию, но использовал лямбда-синтаксис в качестве параметра, как в закомментированных строках ниже?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestLambda24
{
class Program
{
static void Main(string[] args)
{
int[] numbers = { 6, 3, 7, 4, 8 };
//Console.WriteLine("The addition result is {0}.", Tools.ProcessNumbers(p => Tools.AddNumbers, numbers));
Console.WriteLine("The addition result is {0}.", Tools.ProcessNumbers(Tools.AddNumbers, numbers));
//Console.WriteLine("The multiplication result is {0}.", Tools.ProcessNumbers(p => Tools.MultiplyNumbers, numbers));
Console.WriteLine("The multiplication result is {0}.", Tools.ProcessNumbers(Tools.MultiplyNumbers, numbers));
Console.ReadLine();
}
}
class Tools
{
public static int ProcessNumbers(Func<int[], int> theMethod, int[] integers)
{
return theMethod(integers);
}
public static int AddNumbers(int[] numbers)
{
int result = 0;
foreach (int i in numbers)
{
result += i;
}
return result;
}
public static int MultiplyNumbers(int[] numbers)
{
int result = 1;
foreach (int i in numbers)
{
result *= i;
}
return result;
}
}
}