Передать метод как параметр в конструктор с помощью делегатов - C#

Узнай цену своей работы

Формулировка задачи:

Необходимо передать функцию как параметр в конструктор. Я прочитал про делегаты и описал его:
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;
            }
}
        }
В необходимом классе есть поле public FunctionChoice _Funct; Я в конструкторе прописываю: _Funct = new FunctionChoice(TargetFunction.RastriginFunction); и всё работает. но как бы мне этот TargetFunction.RastriginFunction передать в конструктор в качестве параметра?

Решение задачи: «Передать метод как параметр в конструктор с помощью делегатов»

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);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы