Example shows how to implement extension methods, and how to make those flexible to can accept any Action delegate.

using System;
using System.Net;
using System.Diagnostics;

namespace ExtensionMethods
{
    class Program
    {
        static void Main(string[] args)
        {
            Action download = () => new WebClient().DownloadString("http://microsoft.com/");
            var time1 = download.GetExecutionTime();
            Console.WriteLine(time1.Milliseconds);

            Action<string> downloadWithOneParam = (url) => new WebClient().DownloadString(url);
            var time2 = downloadWithOneParam.Partial<string>("http://micrisoft.com/").GetExecutionTime();
            Console.WriteLine(time2.Milliseconds);

            Console.ReadKey();
        }
    }

    static class Extensions
    {
        public static TimeSpan GetExecutionTime(this Action action)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Stopwatch watch = new Stopwatch();
            watch.Start();
            action();
            watch.Stop();
            return watch.Elapsed;
        }

        public static Action Partial<TParam1>(this Action<TParam1> func, TParam1 param)
        {
            return () => func(param);
        }
    }
}