Подтвердить что ты не робот

Как определить метод вызова и имя класса?

В настоящее время я разрабатываю библиотеку регистрации приложений, используя встроенный TraceListener. Эта библиотека будет использоваться во многих проектах и ​​должна предлагать простой интерфейс, где мне нужно только заботиться о том, что WHAT будет записано в файл журнала, но не КАК.

Используя пространство имен отражения, я могу выяснить, какое приложение в настоящее время называется функцией журнала (получение имени сборки выполнения), но я также хочу указать имя функции и класса, которые вызвали функцию ведения журнала.

Скажем, у меня есть:

public static void LogInfo(string vLogText) {
   Trace.WriteLine(
        MethodInfo.GetCurrentMethod().Name
        + this.GetType().ToString() + vLogText);
   }

Когда я вызываю из другого проекта (класс: TestClass, метод: TestMethod)

Tracer.LogInfo("log this!")

Я ожидаю увидеть в журнале:

TestClass, TestMethod, log this!

Но вместо этого я получил

TracerClass, LogInfo, log this!

Как получить родительский метод и имя класса?

4b9b3361

Ответ 1

Новые С# и VS 2012 поставляются с информацией о вызывающем абоненте (а именно CallerFilePathAttribute, CallerLineNumberAttribute и CallerMemberNameAttribute)), которые помогут вам, если вы можете используйте его.

Если вы не можете, вам придется обратиться к другим ответам.

Ответ 2

Попробуйте сделать что-то вроде этого:

var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;
// where 1 illustrates how deep into the stack to reflect.

В С# 5.0 есть более элегантные решения, но если вы используете устаревшие фреймворки, то это поможет.

Ответ 3

Вы можете просто записать полную трассировку стека, а не только метод вызова, используя Environment.StackTrace. Это может помочь вам, если вы хотите использовать ту же структуру протоколирования для журнальных исключений.

Для получения дополнительной информации см. эту страницу msdn.