Создать функцию с подсчетом вызовов - C#
Формулировка задачи:
В общем, примитивная задача, решил её таким образом:
Но очень многословный синтаксис вызова func.Apply(x) хотелось бы что-нибудь вроде func(x). Да и все методы куда-то деваются, но в таком случае пропадают все методы класса Func. Хотел наследовать, но он оказался sealed. Как быть? Хотел инкапсулировать вызовы в самой функции, но вот не очень получается
using System;
namespace ConsoleApplication43
{
class Program
{
static void Main()
{
var func = new FunctionWithCounter<double, double>(x => x*x);
for (int i = 0; i < 5; i++)
Console.WriteLine(func.Apply(i));
Console.WriteLine("Count of calls = {0}", func.Calls.ToString());
Console.ReadKey();
}
}
class FunctionWithCounter<T,TResult>
{
private readonly Func<T, TResult> func;
public int Calls { get; private set; }
public FunctionWithCounter(Func<T, TResult> func)
{
Calls = 0;
this.func = func;
}
public TResult Apply(T parameter)
{
Calls++;
return func(parameter);
}
}
}Решение задачи: «Создать функцию с подсчетом вызовов»
textual
Листинг программы
static void Main(string[] args)
{
Func<int, int> func = x => x*x;
Func<int, int> func1 = x => x + x;
Functor<int, int, bool>.RegisterFunc(ref func);
Functor<int, int, object>.RegisterFunc(ref func1);
for(int i = 0 ; i< 10; ++i)
{
func(4);
}
func1(5);
Console.WriteLine(Functor<int, int, bool>.Count);
Console.WriteLine(Functor<int, int, object>.Count);
Console.ReadKey();
}
public class Functor<T1, T2, Fake>
{
static Functor()
{
Count = 0;
}
public static void RegisterFunc(ref Func<T1, T2> func)
{
Count = 0;
Func<T1, T2> func1 = func;
func = t1 => { ++Count; return func1(t1); };
}
public static int Count { get; private set; }
}