Имя переменной, переданное в аргументе C#
Проблема такая - когда дебажишь что-то с помощью Console.WriteLine, хочется просто и быстро узнать значения всех аргументов. Думал сделать так
void Main()
{
int i = 5;
string g = "test";
MassConsoleWriteLine(i,j);
}
void MassConsoleWriteLine(object[] params)
{
string s = "";
foreach(var k in params)
{
s+= nameof(k) + " is " + k + ", ";
}
Console.WriteLine(k);
}
Ожидаемый результат
i is 5, g is test
Оно не работает - в случае foreach nameof выдает имя внутренней переменной цикла, т.е. k, а в случае for код не компилируется, ибо params[index] не имеет имени.
Как сделать чтобы работало? Я понимаю что они различаются типом - string ссылочный, int значения, однако задача именно сделать универсальный метод - пусть ест любые типа и если может - выводит их значения.
Ответы (1 шт):
Вообще это странное занятие, то что вы делаете. Есть отладчик, он вам всё покажет. Но если очень хочется, то почему бы и нет. Хотя-бы для развлечения.
class Program
{
static void Main()
{
int i = 5;
string j = "test";
MassConsoleWriteLine(i, j);
Console.ReadKey();
}
static void MassConsoleWriteLine(params object[] parameters)
{
// берем стек вызовов и фрейм номер 1 из него, это будет как раз вызывающая строка кода
StackFrame frame = new StackTrace(true).GetFrame(1);
// достаем текст этой строки из файла с C# кодом
string codeLine = File.ReadAllLines(frame.GetFileName())[frame.GetFileLineNumber() - 1].Trim();
// достаем имена переменных из строки кода
// я не силен в регулярках, возможно можно сделать красивее
string[] vars = Regex.Match(codeLine, @"\((.+?)\)").Groups[1].Value.Split(',').Select(x => x.Trim()).ToArray();
// формируем вывод
List<string> output = new List<string>();
for (int i = 0; i < parameters.Length; i++)
{
output.Add($"{vars[i]} is {parameters[i]}");
}
// выводим
Console.WriteLine(string.Join(", ", output));
}
}
Вывод в консоль
i is 5, j is test
Здесь много условностей и ограничений, и при изменении условий использования этого кода потребуются доработки. Но на вашем примере оно работает исправно.