2013-02-13 5 views
22

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

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

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

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! 

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

+5

[Это может помочь вам безмерно] (http://msdn.microsoft.com/en-us/library/hh534540.aspx), если вы используете новейшие C# и VS 2012. –

+0

@ Trustme-I'maDoctor великолепно! Не знал об этом. Не могли бы вы ответить на этот вопрос вместо комментария, чтобы я мог проголосовать и отметить его как закрытого? Большое спасибо. – Neurodefekt

+0

@Neurodefekt Нет проблем, все готово. Рад, что смог помочь. :) –

ответ

27

Новейший C# и VS 2012 поставляется с Caller Information (а именно CallerFilePathAttribute, CallerLineNumberAttribute и CallerMemberNameAttribute), который поможет вам, если вы можете использовать только его.

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

+1

Это кажется отличным ответом на меня, я всегда смущаюсь получить доступ к stackTrace для этой цели. Один вопрос, хотя он кажется процессором предварительной компиляции и будет заменен фактическим именем вызывающего абонента в IL-коде. поэтому я думал, что я не буду в безопасности, если кто-то предпочитает обфускать код IL. любые комментарии по этому поводу? –

+1

@MubasharAhmad Из [документации] (https://msdn.microsoft.com/en-us/library/mt653988.aspx): «Значения информации о вызывающем абоненте генерируются как литералы в промежуточный язык (IL) во время компиляции. результаты свойства StackTrace для исключений, на результаты не влияет обфускация ». –

16

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

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

Есть более элегантные решения в C# 5.0>, однако, если вы используете старые рамки, выше поможет.

+13

Две вещи: 1) Это может существенно повлиять на производительность. 2) В оптимизированном коде метод inline может привести к тому, что будет напечатано неправильное имя метода. –

2

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

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

Смежные вопросы