2010-08-25 1 views
5

Мне недавно было поручено добавлять инструкции каротажа к каждому вызову метода в решении. Эти записи журнала должны содержать имя класса и метода.Вход в C#: Получение производительности класса/метода

Я знаю, что могу использовать MethodBase.GetCurrentMethod() и методы StackFrame.GetMethod(). Что лучше? Есть ли лучший (или более эффективный) способ получить имя класса и метода?

+5

* Every * способ? Есть более простые способы сделать ваше приложение в десять тысяч раз медленнее или генерировать гигабайт текста в минуту. –

+3

Моя участь в жизни - это делать только то, что просит клиент. –

+0

В консультационных отношениях есть место для конструктивной критики и, по сути, это важная часть работы. Я работал над проектами, которые имели такой широко распространенный журнал трассировки, и обычно это приводило к тому, что все игнорировали журналы, если им не потребовалось несколько часов, чтобы потребовать их прохождения. –

ответ

5

У меня есть два предложения:

  1. Используйте рамки готовые АОП (как http://www.sharpcrafters.com/) они могут справиться с этим легко
  2. ли действие пользовательских prebuild, где вы заменить какой-то огрызок в начале каждый метод:

    недействительного PerformSomeAction() { // PUT_LOGGING_HERE }

затем в пользовательском инструменте замените эти заглушки на имена методов. Это гарантируется самым быстрым способом, но требует некоторых инвестиций.

+0

+1 Это сценарий, для которого был создан АОП. –

+0

Если бы я мог, я уже поднял это предложение. Не то, чтобы это не отличная точка. –

1

this.getType().toString() вы должны получить класс

О методе, кажется StackFrame и MethodBase наиболее obvouis решения, я не могу комментировать, который является более эффективным.

+1

за исключением того, что это C#, а не Java, но вы, как правило, правы – Andrey

+0

Должно ли быть this.GetType(). ToString()? или я пропущу что-то еще. – Raynos

+0

Object.ToString() вернет имя класса, если ToString() не было переопределено. – Nate

2

Ну, лучший/самый быстрый способ - включить строку в каждую функцию. Это может оказаться не самым практичным решением, но MethodBase.GetCurrentMethod() требует кодирования внутри каждого метода, который его использует. т.е. Вы можете написать

string funcName = "MyClass.MyFunction(int, int)"; 

или вы можете написать

string funcName = MethodBase.GetCurrentMethod().Name 

Теперь, если вы хотите, чтобы получить имя функции, которая называется текущей функции (то есть, вы хотите сделать это в одно место в вашей функции регистрации), то ваш единственный вариант - чтение через StackFrame.

+0

Если я правильно помню, MethodBase.GetCurrentMethod() также может возвращать разные результаты на основе любой инлайн-оптимизации, выполняемой компилятором, поэтому имена функций жесткого кодирования могут быть более надежными в этом смысле. –

+0

вы можете автоматизировать включение имени функции в строку в процессе сборки – Andrey

Смежные вопросы