В основном я хочу написать клиентский регистратор/трассировщик, который также регистрирует имя класса и метода метода, вызывающего регистратор/трассировщик. Это должно быть быстро, чтобы не влияло на производительность приложения, строго типизировано и чисто. У кого-нибудь есть хорошие идеи?
Вот несколько, которые у меня были, но я беспокоюсь о производительности из-за отражения:
StackTrace/StackFrame (слишком много накладных расходов?)
MethodInfo.GetCurrentMethod() (все еще слишком медленный? И не очень чистый)
передать метод в качестве делегата (С# может сделать это неявно, и у меня есть доступ к MethodInfo, но не очень чистый)
Я ценю любые комментарии.
ОБНОВЛЕНИЕ:
Мне понравилась чистота StackFrame, поэтому я задал более конкретный вопрос здесь относительно производительности StackFrame и Я получил действительно хороший ответ, включая тесты производительности. Получается, что MethodInfo.GetCurrentMethod() является самым быстрым (занимает около 1 микросекунды на моем компьютере), а new StackFrame(1) может быть запрошен по запросу (занимает около 15-20 микросекунд на моем компьютере). Я выбросил метод как опцию делегата, так как это слишком беспорядочно, когда метод имеет несколько параметров.
ЗАКЛЮЧЕНИЕ:
Я рассмотрел все варианты, и лучше всего написать собственный подключаемый модуль для PostSharp, который вводит имя метода в виде строки в MSIL во время компиляции при применении к нему пользовательского атрибута, такого как [Trace]. На мой взгляд, это самый быстрый и ремонтопригодный вариант. Это даже позволяет гораздо больше вещей, таких как передача имен параметров и аргументов без какого-либо отражения, а также автоматический захват и регистрация исключений. Этот мой связанный вопрос для получения дополнительной информации.