Сообщение Re[2]: Логгинг с именами функций и номерами строк от 11.08.2017 8:37
Изменено 13.08.2017 12:15 VladD2
Re[2]: Логгинг с именами функций и номерами строк
Здравствуйте, rameel, Вы писали:
R>Здравствуйте, BigBoss, Вы писали:
BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.
R>Почему не работают и что значит в лоб?
R>
В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.
BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.
R>Вот здесь не понял
Запускаем, получаем
BB>>
R>Вот это у тебя вообще не скомпилируется
Да, я опустил прототип LogMessage без args[] и Format().
BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args
оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
R>Здравствуйте, BigBoss, Вы писали:
BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.
R>Почему не работают и что значит в лоб?
R>
Скрытый текст | |
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
оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
Re[2]: Логгинг с именами функций и номерами строк
Здравствуйте, rameel, Вы писали:
BB>>К версии 4.5 появились System.Runtime.CompilerServices, но "в лоб" это тоже не работает.
R>Почему не работают и что значит в лоб?
BB>>
В лоб -- это буквально как написано. А не работает потому, что если список параметров концается на строку/две строки/две строки+целое, то эти параметры естественным образом попадают не в args, а в memberName/sourceFilePath/sourceLineNumber.
BB>>компилируется, но естественно не так, как хотелось бы, аттрибуты на сопоставление параметров не влияют.
R>Вот здесь не понял
Запускаем, получаем
BB>>
R>Вот это у тебя вообще не скомпилируется
Да, я опустил прототип LogMessage без args[] и Format().
BB>>А как (можно ли вообще) на C# написать функцию вроде LogMessage, но работающую и без черезмерного синтаксического оверхеда?
R>Воспользоваться например T4 и сгенерировать методы с нужным набором параметров, чтобы не создавать массив для args
оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел
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
оно так и было изначально написано, это ничего не меняет в связывании формальных и фактических параметров. Пример с массивом я для краткости привел