-1

class-nameでの入手方法caller info attributes

strongly say a noリフレクションを使用してクラス名をログに記録します。

以下のようなものを使用してメソッド名を取得できました[CallerMemberName]

        private void Log(string logMessage, [CallerMemberName]string callerName = null)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("Executing Method = {1};{0}", logMessage, callerName);
            }
        }

Caller Info Attributesclass nameを使用してここにログを記録する方法は?

4

2 に答える 2

5

まず第一に、メソッドはプライベートであるため、現在のクラスのみがそれを使用します。この場合、これはtypeof(T).FullNameortypeof(T).Nameプロパティを使用して見つけることができます。

ここで試すこともできるのは、以下に示すように、メソッドがパブリックである場合に他のクラスで機能するクラス名をプログラムでスタック フレームから見つけることです。

private void Log(string logMessage)
{
  StackFrame frame = new StackFrame(1, false);
  MethodBase method = frame.GetMethod();
  Type declaringType = method.DeclaringType;

  // Log declaringType.FullName or other property
}

StackFrame の詳細についてはこちら、MethodBase の詳細についてはこちらをご覧ください。

これを行うもう 1 つの方法は、ログに記録するメソッドに Type パラメーターを設定し、ログに記録する Type を渡すことですが、このクラスの外部からメソッドを呼び出す場合は、メソッドを public にする必要があります。

public void Log(string logMessage, Type classType)
{
  // Log message and class name
}

お役に立てれば。

于 2014-06-24T13:35:53.070 に答える
3

それを行う属性はありません。ただし、Logプライベートであるため、外部クラスは関数を呼び出すことができないため、どのクラスがそれを呼び出したかは既にわかっています。

public SomeClass
{

    //(snip)

    private void Log(string logMessage, [CallerMemberName]string callerName = null)
    {

        if (logger.IsDebugEnabled)
        {
            string className = typeof(SomeClass).Name;

            logger.DebugFormat("Executing Method = {1};{2}.{0}", logMessage, callerName, className);
        }
    }
}
于 2014-06-24T13:30:33.713 に答える