2011-12-29 9 views
4

はこのJavaScriptコードスニペットを考えてみましょう:一般的な、集中型のパラメータロガー方法、C#で

Object.prototype.log = function() { 
    // here, you have a centralized place to do logging stuff; 
    console.log(this); 
} 

function fullName(firstName, lastName) 
{ 
    // here, using a simple one-line code, you can log all parameters; 
    arguments.log(); 
} 

fullName('saeed', 'nemati'); 

は、我々はC#で、メソッドに渡されたすべてのパラメータを記録するための同様のメカニズムを持つことができますか?

:私は何をやったかは、リフレクションを使用していたが、成功しません:

public static void LogParameters(this ParameterInfo[] parameters) 
{ 
    StringBuilder builder = new StringBuilder(); 
    builder.Append("*****************\r\n"); 
    builder.Append("Parameters\r\n"); 
    parameters.ToList().ForEach(pi => 
    { 
     builder.AppendFormat("{0} => {1}\r\n", pi.Name, pi.DefaultValue); 
     // The problem is that, I can't get the value of the parameter here 
    }); 
    builder.Append("*****************"); 
    Log.Write(builder.ToString()); 
} 

public string GetFullName(string firstName, string lastName) 
{ 
    MethodBase.GetCurrentMethod().GetParameters().LogParameters(); 
    return firstName + " - " + lastName; 
} 

GetFullName("saeed", "neamati"); 

答えて

7

いいえ、あなたは、リフレクションを使用してパラメータ値を取得することはできません。明示的にロギングメソッドに渡す必要があります。

デバッガAPIを使用してこれを行うことはできますが、そうしたくない場合があります。私はあなたのことを明示的に行います - そして、実際には、重要なものだけをログに記録し、メッセージにもいくつかのコンテキストを与えることができるので、より有用なログに終わる可能性があります。

+0

どのように悲しい、そしてどれくらい悪い。 AMAIK、PHPには 'arguments'オブジェクトもあります。知りません。私がこれを行うことができれば、渡されたパラメータの値を見ることで、ライブアプリケーションの問題のトラブルシューティングをより柔軟に行うことができます。同時に、メソッドごとに多くのコード行を書くべきではありません。 : –

+0

@SaeedNeamati:ライブアプリケーションのトラブルシューティングを行う場合は、通常、*ターゲット*ロギングでコンテキストと関連する*引数を説明したいと思っていますが、個人的には役に立たないと思います –

+0

はい、しかし、何度も(時にはそうではない))何かを記録するために、たくさんのコードを書いているのは本当にうんざりです。例えば、** Exception **型の拡張メソッドを既に持っていて、例外的に、ex.Handle();を使って例外を記録するだけです。もちろん、エレガントで、簡単で、集中的で、開発者にやさしいものです。 :) –

関連する問題