Получение имени класса

Как получить 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);
            }
        }

Как войти class name здесь, используя Атрибуты Caller Info?

2 ответа

Решение

Вы не можете найти доступный атрибут, который это делает. Однако, потому что 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);
        }
    }
}

Прежде всего, метод является закрытым, поэтому его будет использовать только текущий класс, и в этом случае его можно найти с помощью typeof(T).FullName или же typeof(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
}

Надеюсь это поможет.

Другие вопросы по тегам