Вход в C #: получение производительности имени класса / метода

Недавно мне было поручено добавить операторы ведения журнала к каждому вызову метода в решении. Эти записи журнала должны содержать имя класса и метода.

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


person Zachary Yates    schedule 25.08.2010    source источник
comment
Каждый метод? Есть более простые способы сделать ваше приложение в десять тысяч раз медленнее или генерировать гигабайт текста в минуту.   -  person Hans Passant    schedule 25.08.2010
comment
Моя судьба в жизни - только делать то, что просит клиент.   -  person Zachary Yates    schedule 25.08.2010
comment
В консультационных отношениях есть место для конструктивной критики, и, по сути, это важная часть работы. Я работал над проектами, в которых был такой вид повсеместного ведения журнала трассировки, и это, как правило, приводило к тому, что все игнорировали журналы, если только им не приходилось тратить несколько часов, чтобы копаться в них.   -  person Dan Bryant    schedule 25.08.2010
comment
@ Дэн, я уже упоминал об этом. В целом у меня был такой же опыт ведения журналов такого рода. Обычно необходимость в этом указывает на гораздо более глубокую проблему дизайна (которая определенно есть в этом проекте). Важнейшим фактором является то, что вы должны выбрать наиболее эффективный путь доставки программного обеспечения. Ненавижу это признавать, но в данном случае клиент прав.   -  person Zachary Yates    schedule 25.08.2010


Ответы (3)


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

  1. Используйте готовые фреймворки AOP (например, http://www.sharpcrafters.com/), они легко справятся с этим.
  2. Выполните настраиваемое действие предварительной сборки, в котором вы заменяете какую-то заглушку в начале каждого метода:

    void PerformSomeAction () {// PUT_LOGGING_HERE}

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

person Andrey    schedule 25.08.2010
comment
Если бы я мог, я уже высказал это предложение. Не то чтобы это не лучший момент. - person Zachary Yates; 25.08.2010

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

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

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

string funcName = MethodBase.GetCurrentMethod().Name

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

person James Curran    schedule 25.08.2010
comment
Если я правильно помню, MethodBase.GetCurrentMethod () также может возвращать разные результаты на основе любой встраивания / оптимизации, выполненной компилятором, поэтому имена функций жесткого кодирования могут быть более надежными в этом смысле. - person Adam Lear; 25.08.2010
comment
вы можете автоматизировать включение имени функции в виде строки в процессе сборки - person Andrey; 25.08.2010

this.getType().toString() должен принести вам класс

Что касается метода, кажется, что stackFrame и methodbase являются наиболее очевидными решениями, я не могу прокомментировать, какой из них более эффективен.

person Raynos    schedule 25.08.2010
comment
Это должно быть this.GetType (). ToString ()? или мне что-то еще не хватает - person Raynos; 25.08.2010
comment
Object.ToString () вернет имя класса, если ToString () не был переопределен. - person Nate; 26.08.2010