获取类名

本文关键字:获取 | 更新日期: 2023-09-27 18:10:08

如何用caller info attributes得到class-name

I 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);
            }
        }

如何使用调用者信息属性记录class name ?

获取类名

首先,该方法是私有的,所以只有当前类会使用它,在这种情况下,这可以通过使用typeof(T).FullNametypeof(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参数,并传递你想要记录的类型,但是如果要从这个类外部调用该方法,则该方法需要是公共的:

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

你不能,没有可用的属性可以做到这一点。然而,由于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);
        }
    }
}