Передать метод как параметр в конструктор с помощью делегатов - C#
Формулировка задачи:
Необходимо передать функцию как параметр в конструктор.
Я прочитал про делегаты и описал его:
В необходимом классе есть поле public FunctionChoice _Funct;
Я в конструкторе прописываю:
_Funct = new FunctionChoice(TargetFunction.RastriginFunction);
и всё работает.
но как бы мне этот TargetFunction.RastriginFunction передать в конструктор в качестве параметра?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Attack
{
//делегат для выбора функции
public delegate double FunctionChoice(double[] dArrayArguments, double[] dMinArgument, double[] dMaxArgument, bool bMax);
class TargetFunction
{
//функция Растригина
public static double RastriginFunction(double[] dArrayArguments, double[] dMinArgument, double[] dMaxArgument, bool bMax)
{
int iDimension = dArrayArguments.Length;//размерность массива
double dResult = 0.0;//результат функции Растригина
for (int i = 0; i < dArrayArguments.Length; i++)
{
//проверка на выход из области определения функции
if (!CheckFunctionArgument(ref dArrayArguments[i], ref dMinArgument[i], ref dMaxArgument[i]))
return ReturnInfinity(ref bMax);
dResult += Math.Pow(dArrayArguments[i], 2) - 10 * Math.Cos(2 * Math.PI * dArrayArguments[i]);
}
dResult += 10 * iDimension;
return dResult;
}
}
}Решение задачи: «Передать метод как параметр в конструктор с помощью делегатов»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass((Action<int, int>)delegate(int i, int j)
{
//Тут операторы, которые будут выполняться делегатом класса
Console.WriteLine("{0}, {1}", i, j);
});
mc.RunDelegate();
Console.ReadLine();
}
}
public class MyClass
{
private Action<int, int> innerDelegate;
public MyClass(Action<int,int> paramDelegate)
{
innerDelegate = paramDelegate;
}
public void RunDelegate()
{
innerDelegate(10, 20);
}
}
}