-1

如何获得class-namewith 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的更多信息

您可以执行此操作的另一种方法是在要记录的方法上使用 Type 参数,并传入要记录的 Type,但是如果要从此类外部调用该方法,则该方法需要是公共的:

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 回答