using System;
using System.Diagnostics;
public class Test
{
static void Main()
{
var app = new ExcelApp();
Console.WriteLine(app.TimedMethodCall("a", "b", "c"));
}
}
public interface IHostApplication
{
void Run(string target);
void Run(string projectName, string moduleName, string methodName);
}
public class ExcelApp : IHostApplication
{
public void Run(string target)
{
Console.WriteLine("Excel: {0}", target);
}
public void Run(string projectName, string moduleName, string methodName)
{
Run(string.Concat(projectName, ".", moduleName, ".", methodName));
}
}
static class HostApplicationExtensions
{
public static long TimedMethodCall(
this IHostApplication application,
string projectName,
string moduleName,
string methodName)
{
var stopwatch = Stopwatch.StartNew();
application.Run(projectName, moduleName, methodName);
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglzdGF0aWMgdm9pZCBNYWluKCkKCXsKCSAgICB2YXIgYXBwID0gbmV3IEV4Y2VsQXBwKCk7CgkgICAgQ29uc29sZS5Xcml0ZUxpbmUoYXBwLlRpbWVkTWV0aG9kQ2FsbCgiYSIsICJiIiwgImMiKSk7Cgl9Cn0KCnB1YmxpYyBpbnRlcmZhY2UgSUhvc3RBcHBsaWNhdGlvbgp7CiAgICB2b2lkIFJ1bihzdHJpbmcgdGFyZ2V0KTsKCiAgICB2b2lkIFJ1bihzdHJpbmcgcHJvamVjdE5hbWUsIHN0cmluZyBtb2R1bGVOYW1lLCBzdHJpbmcgbWV0aG9kTmFtZSk7Cn0KCnB1YmxpYyBjbGFzcyBFeGNlbEFwcCA6IElIb3N0QXBwbGljYXRpb24KewogICAgcHVibGljIHZvaWQgUnVuKHN0cmluZyB0YXJnZXQpCiAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4Y2VsOiB7MH0iLCB0YXJnZXQpOwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCBSdW4oc3RyaW5nIHByb2plY3ROYW1lLCBzdHJpbmcgbW9kdWxlTmFtZSwgc3RyaW5nIG1ldGhvZE5hbWUpCiAgICB7CiAgICAgICAgUnVuKHN0cmluZy5Db25jYXQocHJvamVjdE5hbWUsICIuIiwgbW9kdWxlTmFtZSwgIi4iLCBtZXRob2ROYW1lKSk7CiAgICB9Cn0KCnN0YXRpYyBjbGFzcyBIb3N0QXBwbGljYXRpb25FeHRlbnNpb25zCnsKICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBUaW1lZE1ldGhvZENhbGwoCiAgICAgICAgdGhpcyBJSG9zdEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLAogICAgICAgIHN0cmluZyBwcm9qZWN0TmFtZSwKICAgICAgICBzdHJpbmcgbW9kdWxlTmFtZSwKICAgICAgICBzdHJpbmcgbWV0aG9kTmFtZSkKICAgIHsKICAgICAgICB2YXIgc3RvcHdhdGNoID0gU3RvcHdhdGNoLlN0YXJ0TmV3KCk7CiAgICAgICAgYXBwbGljYXRpb24uUnVuKHByb2plY3ROYW1lLCBtb2R1bGVOYW1lLCBtZXRob2ROYW1lKTsKICAgICAgICBzdG9wd2F0Y2guU3RvcCgpOwogICAgICAgIHJldHVybiBzdG9wd2F0Y2guRWxhcHNlZE1pbGxpc2Vjb25kczsKICAgIH0KfQ==