Как известно, __LINE__, __FILE__ вместе с макро в C# не попали.
StackFrame медленный и вообще не должен компилироваться в native (не пробовал, но рефлексии там вроде нет).
К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает. Вариации на тему
Вот это у тебя вообще не скомпилируется BB>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args
void LogMessage(string format, object arg
void LogMessage(string format, object arg0, object arg1
void LogMessage(string format, object arg0, object arg1, object arg2
void LogMessage(string format, object arg0, object arg1, object arg2, object arg3
...
Здравствуйте, rameel, Вы писали:
BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает. R>Почему не работают и что значит в лоб?
BB>>
В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.
BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.
R>Вот здесь не понял
Да, я опустил прототип LogMessage без args[] и Format().
BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args
оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
Здравствуйте, BigBoss, Вы писали:
BB>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
Остается вариант с интерполяцией строк.
using System;
public class Test
{
public static void Log(FormattableString message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
Console.WriteLine(message.ToString());
Console.WriteLine(sourceFilePath + ":" + sourceLineNumber);
}
public static void Main()
{
Log($"Foo: {1}");
}
}
Здравствуйте, BigBoss, Вы писали:
BB>Как известно, __LINE__, __FILE__ вместе с макро в C# не попали. BB>StackFrame медленный и вообще не должен компилироваться в native (не пробовал, но рефлексии там вроде нет). BB>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает. Вариации на тему
BB>
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, BigBoss, Вы писали:
BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
H>Остается вариант с интерполяцией строк.