using System;
public class Test
{
public static Func<T, TResult> MakeFunctionWithCounter<T, TResult>(Func<T, TResult> func)
{
int counter = 0;
return t => { counter++; return func(t); };
}
public static int Counts<T, TResult>(Func<T, TResult> call)
{
return (int)call.Target.GetType().GetField("counter").GetValue(call.Target);
}
static void Main(string[] args)
{
var f = new Func<double, double>(d => d*d);
f = MakeFunctionWithCounter(f);
f(1);
f(2);
f(3);
Console.WriteLine(Counts(f));
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewogICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuYzxULCBUUmVzdWx0PiBNYWtlRnVuY3Rpb25XaXRoQ291bnRlcjxULCBUUmVzdWx0PihGdW5jPFQsIFRSZXN1bHQ+IGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CiAgICAgICAgICAgIHJldHVybiB0ID0+IHsgY291bnRlcisrOyByZXR1cm4gZnVuYyh0KTsgfTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvdW50czxULCBUUmVzdWx0PihGdW5jPFQsIFRSZXN1bHQ+IGNhbGwpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKGludCljYWxsLlRhcmdldC5HZXRUeXBlKCkuR2V0RmllbGQoImNvdW50ZXIiKS5HZXRWYWx1ZShjYWxsLlRhcmdldCk7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZiA9IG5ldyBGdW5jPGRvdWJsZSwgZG91YmxlPihkID0+IGQqZCk7CiAgICAgICAgICAgIGYgPSBNYWtlRnVuY3Rpb25XaXRoQ291bnRlcihmKTsKICAgICAgICAgICAgZigxKTsKICAgICAgICAgICAgZigyKTsKICAgICAgICAgICAgZigzKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoQ291bnRzKGYpKTsKICAgICAgIH0KfQ==