2013-09-18 3 views
-2

Я написал класс интерфейса для Selenium WebDriver, который включает обработчик исключений, который записывает некоторую диагностическую информацию, прежде чем реорганизовывать исключение. Было бы легче диагностировать проблему позже, если бы у меня было имя метода, инициировавшего операцию Selenium. Как получить имя метода, который сделал первый вызов в моем классе интерфейса?Как получить имя вызывающего метода из другого класса

+0

При отправке вопроса внизу появляется флажок, который позволяет включить ответ с сообщением. Это объясняет, почему кто-то тоже это сделает. –

+0

@tnw, пожалуйста, удалите ваши downvotes на мой вопрос и ответ. Это не конструктивная обратная связь. –

ответ

3

Самый ценный вариант, если вы используете VS 2012, чтобы использовать CallerMemberNameAttribute. Это вызовет компилятор , чтобы заполнить имя метода во время компиляции, так как не имеет накладных расходов.

Вы должны были бы добавить это к вашим вызовам методов, однако:

void YourMethod(string yourFirstArg, [CallerMemberName] string callingMethodName = "") 
{ 
    //.. 

Обратите внимание, что вы можете также использовать StackTrace и StackFrame, но они имеют совсем немного дополнительные накладные расходы.

+0

Возможно, мой вопрос был немного неясным. Вызывающий метод может быть из моего класса интерфейса. Если это так, то это решение не работает. –

+0

@ carlin.scott Интерфейс никогда не может вызвать метод ...? –

+0

Ну, я думаю, это все равно будет работать, но все другие методы должны пройти по аргументу callMethodName, но затем я задал бы вопрос: лучше ли делать простые изменения во многих местах или вносить сложные изменения в одном месте и как важно несколько сотен миллисекунд, когда пришло время собирать информацию об отказах. –

-1

Используя объект System.Diagnostics, вы можете получить трассировку стека, а затем используя linq вы можете найти последний добавленный фрейм, который не был объявлен в текущем классе. Имейте в виду, что компилятор JIT может встроить некоторые методы в стек во время оптимизации кода, что сделало бы это менее полезным.

new System.Diagnostics.StackTrace(1, false).GetFrames().First(f => f.GetMethod().DeclaringType != System.Reflection.MethodBase.GetCurrentMethod().DeclaringType).GetMethod().Name 
Смежные вопросы