Как определить метод вызова и имя класса?
В настоящее время я разрабатываю библиотеку регистрации приложений, используя встроенный 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!
Как получить родительский метод и имя класса?
Ответы
Ответ 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.