1
Log ( MethodBase.GetCurrentMethod().DeclaringType.Name + MethodBase.GetCurrentMethod.Name + "blah blah..."  );

returns something like

MyClass.ThisMethod : Error is blah blah..

Now,

1) MethodBase.GetCurrentMethod().DeclaringType.Name is capable of throwing a NullReferenceException. How to avoid this? Or what is the good way to know the class in which the currentmethod is present ?

2) Is there any other way to achieve the same ?

4

2 に答える 2

3

エラー イベントのログ、またはアプリケーション関数やメソッドの完了ログの場合でも、通常、リフレクション呼び出しのパフォーマンスは問題になりません。特に、通常、各クラスとメソッドに名前付き文字列を含めるよりもリフレクション呼び出しを使用する方が望ましいためです。

MethodBase への呼び出しは、パフォーマンス クリティカル セクションでは使用しないでください。このような場合、可能であれば使用する前にリフレクション値をキャッシュするか、前述の名前付き文字列などの代替オブジェクトを使用する必要があります。

例えば。Log (m_zClassName, zMethodName, "メソッド Wizbot が完了しました。");

基準

私の i7-2600k のベンチマークでは、MethodBase.GetCurrentMethod() への各呼び出しは約 1600 ナノ秒 (0.0016 ミリ秒) です。

改善

そうは言っても、必要なのは同じオブジェクトの2つのメンバーであるため、OPによって投稿されたコードはMethodBase.GetCurrentMethod()を2回呼び出さないことでパフォーマンスを大幅に向上させることができます。

OP のコード (フォーマットあり) = 2 つの MethodBase.GetCurrentMethod() 呼び出しで ~3200ns:

Log(String.Concat(MethodBase.GetCurrentMethod().DeclaringType.Name, ".", MethodBase.GetCurrentMethod().Name, " : Error is blah blah");

MethodBase オブジェクトへの参照を 1 回の MethodBase.GetCurrentMethod() 呼び出しでイベント ログ書き込みメソッド = ~1600ns に渡すだけで、2 倍の速度で実行できます。

EventLogWrite(MethodBase.GetCurrentMethod(), "Error is blah blah");

そして、イベントログの書き込み方法:

public static void EventLogWrite(MethodBase methodBase, string zErrorMessage)
{
    string classname = methodBase.DeclaringType.Name;
    string methodname = methodBase.Name;

    string logmessage = String.Concat(classname, ".", methodname, " : ", zErrorMessage);

    // ... write message to event log file
}

さらに、この設計では、イベント ログ書き込みメソッドへの呼び出しのすべてのインスタンスで、String.Concat とフィールド セパレーターをすべて入力する必要はありません。

于 2013-08-12T01:59:52.960 に答える
0

スタック トレースを使用できます

Using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

から現在のメソッドを呼び出したメソッドを見つけるにはどうすればよいですか?

于 2012-11-21T15:56:13.393 に答える