2017-07-11 15 views
0

実行クラスの名前と名前空間を持つメソッドの名前を取得する例外をログに記録しようとしています。このような何か:今ロガーの現在の名前空間、クラス名、メソッド名の取得を最適化する方法

enter image description here

、私はこのように必要なものをすべて取得することができます。

Log.AppendLog(typeof(FamilyPublishCommand).Namespace + "." + GetType().Name + "." + MethodBase.GetCurrentMethod().Name + ": Started."); 

私は右の名前空間を取得してやっているもののすべてを移動する方法はあります、クラスとメソッド名を別のアセンブリにある静的ユーティリティメソッドに渡す

Logの機能と一緒に、私が情報を取得している現在のアセンブリと同じアセンブリに含まれないようにすることを考えています。私はこれらを分けることができますか?

using System.Reflection; 
static void Log(MethodBase method, string msg) 
{ 
    Console.WriteLine("{0}.{1}: {2}", method.ReflectedType.FullName, method.Name, msg); 
} 

使用法:

Log(MethodBase.GetCurrentMethod(), myString); 

あなたの問題への最も簡単な解決策である

答えて

2

以下は関係なく、あなたがそれを置く何組立動作しません。

毎回MethodBase.GetCurrentMethod()を実行したくない場合は、Logの呼び出しメソッドを取得する必要があります。あなたはそうのようにこれを行うことができます:

MethodBase method = new StackFrame(1).GetMethod(); 

のでLogは次のようになります。

using System.Reflection; 
using System.Diagnostics; 
static void Log(string msg) 
{ 
    var method = new StackFrame(1).GetMethod(); 
    Console.WriteLine("{0}.{1}: {2}", method.ReflectedType.FullName, method.Name, msg); 
} 

は、独自のロギング方法にConsole.WriteLineに置き換えて、あなたが行ってもいいです。

また、完全ためには、名前空間とクラスを気にしない場合は、その後、あなたはさらにLogを簡素化するためにCallerMemberNameを使用することができ、Logと呼ばれるメソッドの名前を気にのみ:

static void Log(string msg, [CallerMemberName] string caller = "") 
{ 
    Console.WriteLine("{0}: {1}", caller, msg); 
} 

これはNLogに似たアプローチを取った場合に便利です。ここでは、クラスごとに別々のstatic Loggerオブジェクトを作成します。そのため、StackTraceを1回実行するだけで、メソッド名だけが気になります。しかし、すべてを単一のメソッドに含めるには、2番目の解決策があります。

+0

ワウ。素晴らしい答え。私はStackFrame(1).GetMethod()が簡単に最善の方法であることに同意します。大好きです。 – konrad

+0

@konrad嬉しいです。 – stybl

関連する問題