Использую debug - сборку приложения, и хотел бы получить имя строки вызова и имя файла. Однако, в случае имени файла, в текущем кадре хранится значение null, а номера строки(столбца также) всегда равны 0. Почему это происходит? Выдержки кода:
StackFrame sf = new StackTrace().GetFrame(1); // да, мне нужен *предыдущий* кадр
string file = sf.GetFileName(); // здесь null(всегда)
string func = sf.GetMethod().Name; // здесь есть имя метода
int line = sf.GetFileLineNumber(); // здесь 0(всегда)
// и так далее
Также, хотелось бы отметить, что StackFrame для конструктора класса всегда возвращает в виде имени метода следующее значение: .ctor Понятно, что сокращение слова Constructor(возможно), но хотелось бы полное имя получить.
Покопавшись ещё более глубоко, проблема была решена следующим образом:
StackFrame sf = new StackFrame(1, true); // второй аргумент конструктора включает запись об источнике(файл, строки)
string file = sf.GetFileName();
string func = "";
if (sf.GetMethod().Name.StartsWith(".")) // проверяем на наличие символа '.' в имени "метода"
func = sf.GetMethod().DeclaringType.Name + ".Constructor"; // устанавливаем имя конструктора через класс: Класс.Конструктор
else
func = sf.GetMethod().Name;
func += "(";
foreach (var t in sf.GetMethod().GetParameters()) // получаем и перечисляем все параметры методов и добавляем к строке
func += t.ToString() + ", ";
if (sf.GetMethod().GetParameters().Length > 0)
func = func.Remove(func.Length - 2);
func += ")";
// выполняется остальной нужный код...
В результате:
Может быть, кому-то я помогу.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей