2012-05-08 20 views
2

いくつかの同様のメソッド呼び出しのパフォーマンスをテストしていますが、いくつかのタイミングとロギングステートメントでラップしています。これらのメソッドをAction delegateパラメータで渡しています。アクションデリゲートの呼び出しの名前/詳細を取得するにはどうすればよいですか?

通話に関する詳細を印刷する方法はありますか?

var httpResult = TestService(() => serviceHttp.Search(criteria)); 
var tcpResult = TestService(() => serviceTcp.Search(criteria)); 
var localResult = TestService(() => servicelocal.Search(criteria)); 

... 

private static double TestService(Action serviceOperation) 
{ 
    const int iterations = 15; 
    ... 

    for (var i = 0; i < iterations; i++) 
    { 
     var watch = Stopwatch.StartNew(); 

     ... 

     Console.WriteLine(string.Format("{0} ElapsedMilliseconds={1}", ????, watch.ElapsedMilliseconds)); 
     // Ideally this would print something like "serviceTcp.DoStuff(...) ElapsedMilliseconds=313" 
    } 

    ... 
} 
+0

私はあなたが表現オブジェクトとして扱う場合は、あなたが引き出すことができます知っていますいくつかの情報。参照してください:http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression –

+0

うーん..あなたはserviceOperationのタイプを変更する必要があります。アクション(デリゲート)を式ツリーに変換することはできません。 – Strillo

+0

少なくとも、ここでは 'Action 'デリゲートを使いたいと思うでしょう。今は、呼び出し側にコンテキストを提供させるのが簡単です。 –

答えて

4

変更あなたのテストメソッドの宣言コール式オブジェクトのCompile方法

private static double TestService(Expression<Action> expression) 

へのテストのための方法を取得するには::

var serviceOperation = expression.Compile(); 

Expressionオブジェクトのことが可能に例えば

メソッド呼び出しについて多くの情報を提供する、yあなたは次のようなものから始めることができます:

private static string GetMethodCallDescription(Expression<Action> expression) 
{ 
    var mce = (MethodCallExpression)expression.Body; 
    var method = mce.Method; 
    var sb = new StringBuilder(); 
    sb.Append(method.DeclaringType.Name); 
    sb.Append("."); 
    sb.Append(method.Name); 
    sb.Append("("); 
    bool firstarg = true; 
    foreach(var arg in mce.Arguments) 
    { 
     if(!firstarg) 
     { 
      sb.Append(", "); 
     } 
     else 
     { 
      firstarg = false; 
     } 
     sb.Append(arg.ToString()); 
    } 
    sb.Append(")"); 
    return sb.ToString(); 
} 
2

これは、表現木を使わずに行うことができます。ただ個別にアクションとパラメータを取り、種類や方法を取得するためにDelegate.TargetDelegate.Methodプロパティを使用するTestServiceの署名を変更します。

var httpResult = TestService(serviceHttp.Search, criteria); 
var tcpResult = TestService(serviceTcp.Search, criteria); 
var localResult = TestService(servicelocal.Search, criteria); 

... 

private static double TestService<T>(Action<T> serviceOperation, T parameter) 
{ 
    const int iterations = 15; 
    ... 

    for (var i = 0; i < iterations; i++) 
    { 
     var watch = Stopwatch.StartNew(); 

     ... 

     string typeName = serviceOperation.Method.IsStatic 
          ? serviceOperation.Method.DeclaringType.Name 
          : serviceOperation.Target.GetType().Name; 
     string methodName = serviceOperation.Method.Name; 
     Console.WriteLine(string.Format("{0}.{1} ElapsedMilliseconds={2}", typeName, methodName, watch.ElapsedMilliseconds)); 
     // Ideally this would print something like "serviceTcp.DoStuff(...) ElapsedMilliseconds=313" 
    } 

    ... 
} 
関連する問題