Re[2]: Логгинг с именами функций и номерами строк
От: BigBoss  
Дата: 11.08.17 08:37
Оценка: 10 (1)
Здравствуйте, rameel, Вы писали:

BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.

R>Почему не работают и что значит в лоб?

BB>>
BB>>    void LogMessage(string format, object[] args,
BB>>        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
BB>>        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
BB>>        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
BB>>    {
BB>>        string msg = string.Format(format, args);
BB>>        Console.WriteLine("{0} {1}:{2} '{3}'", sourceFilePath, memberName, sourceLineNumber, msg);
BB>>    }
BB>>


В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.

BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.


R>Вот здесь не понял


Запускаем, получаем

T:\varargs\Program.cs Main:48 'Hello, world'
T:\varargs\Program.cs world:49 'Hello, {0}'
world Hello:50 '{0}, {1}'



BB>>
BB>>    LogMessage("Hello, world");
BB>>    LogMessage("Hello, {0}", "world");
BB>>    LogMessage("{0}, {1}", "Hello", "world");
BB>>


R>Вот это у тебя вообще не скомпилируется


Да, я опустил прототип LogMessage без args[] и Format().

BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?


R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args


оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
Отредактировано 13.08.2017 12:15 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.