__line__ номер линии кода

173
27 декабря 2017, 18:02

Не первый раз приходится писать

log1(613,"msg");
log1(614,"msg");

В с++ есть классная штука __LINE__ на www.cprogramming.com и с++ ф-ция логирования , есть ли простое решение для с# логирования именно строки, которая выполняется?

Answer 1

Легко! Нужно воспользоваться «магическим» атрибутом [CallerLineNumber], который заставляет компилятор подставить номер строки.

Например, так:

using System.Runtime.CompilerServices;
static int GetLineNumber([CallerLineNumber] int line = -1) => line;

Пример использования:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Этот код находится в строке " + GetLineNumber());
    }
    static int GetLineNumber([CallerLineNumber] int line = -1) => line;
}

В вашем случае я бы объявил функцию log1 так:

void log1(string message, [CallerLineNumber] int line = -1)
{
    if (line != -1) { ... }
}

и вызывал бы просто

log1("msg");

Другие магические атрибуты: [CallerMemberName] (очень полезен для реализации INotifyPropertyChanged!) и [CallerFilePath].

Answer 2

Т.к. для работы атрибутов [CallerLineNumber] нужен .Net 4, хочу заметить что есть и другие решения, среди которых рефлексия. Недостаток рефлексии - если решение не debug (нет отладочной информации) то не будет имени файла, и номера линии. Если есть обфускация - то этот метод вообще не имеет смысла.

void log1(string message){
StackTrace st = new StackTrace(new StackFrame(true));
Console.WriteLine(" Stack trace for current level: {0}", st.ToString());
StackFrame sf = st.GetFrame(0);
Console.WriteLine(" File: {0}", sf.GetFileName());
Console.WriteLine(" Method: {0}", sf.GetMethod().Name);
Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());
Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());
// ...
}

Взято с en so

READ ALSO
Передача параметров из C# в PostgreSQL

Передача параметров из C# в PostgreSQL

Никак не подберу правильную последовательность передачи параметровВылетает ошибка, что входная строка имела неверный формат

230
Аутентификация в ASP.NET MVC и AngularJS

Аутентификация в ASP.NET MVC и AngularJS

Доброго времени суток! Возникла следующая трудность, при передаче данных о пользователе, прошедшем аутентификацию в приложении ASPNET MVC на строну...

225
Xamarin android не подгружаются файлы проекта?

Xamarin android не подгружаются файлы проекта?

У Xamarin Forms для android проекта хочу разместить изображение по нажатию на кнопкуДля этого в MainPage

213
Недоступная форма

Недоступная форма

Для перемещения окна есть прозрачный Rectangle, но если двигать окно и в этот момент это окно "превращается" в другое:

132