C # версия макроса __FUNCTION__ - PullRequest
13 голосов
/ 03 ноября 2008

Есть ли у кого-нибудь хорошее решение для C # версии макроса C ++ __FUNCTION__? Компилятору это не нравится.

Ответы [ 6 ]

20 голосов
/ 03 ноября 2008

Попробуйте использовать это вместо этого.

System.Reflection.MethodBase.GetCurrentMethod().Name

C # не имеет __LINE__ или __FUNCTION__ макросов, подобных C ++, но есть эквиваленты

8 голосов
/ 02 декабря 2008

В настоящее время я использую такую ​​функцию:

using System.Diagnostics;

public string __Function() {
    StackTrace stackTrace = new StackTrace();
    return stackTrace.GetFrame(1).GetMethod().Name;
}

Когда мне нужно __FUNCTION__, я просто вызываю __Function (). Например:

Debug.Assert(false, __Function() + ": Unhandled option");

Конечно, это решение также использует отражение, но это лучший вариант, который я могу найти. Поскольку я использую его только для отладки (а не для трассировки в сборках релизов), снижение производительности не имеет значения.

Полагаю, мне нужно создать функции отладки и пометить их

[ Conditional("Debug") ]

Вместо этого, но я не дошел до этого.

Спасибо Джеффу Мастри за его решение .

6 голосов
/ 03 ноября 2008

К сожалению, в C # нет эквивалентной версии этого макроса. Я не считаю решение GetCurrentMethodName () эквивалентным макросу C ++ __FUNCTION__. А именно, потому что версия C ++ является вычислением имени во время компиляции. Для C # это вычисление времени выполнения, которое приводит к снижению производительности.

Я не делаю никаких предположений относительно серьезности стоимости, но есть один

4 голосов
/ 03 ноября 2008

Следующее должно работать, хотя оно будет оцениваться во время выполнения, а не во время компиляции.

System.Reflection.MethodBase.GetCurrentMethod().Name
2 голосов
/ 02 сентября 2015

Это добавлено в .NET 4.5.

Смотрите ответ @ roken здесь:

Существуют ли __LINE__ __FILE__ эквиваленты в C #?

1 голос
/ 30 июня 2015

Я использую это:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

Пример использования:

s_log.DebugFormat("{0}", CallerName());

Недостатком использования является то, что каждый раз, когда вы хотите напечатать имя вызывающего абонента, вам нужно перейти к функции ==> времени и производительности производительности! Итак, я использую его для отладки perpose и, если мне нужно распечатать также в производственном коде, я обычно вставляю имя функции в log.Debug, например. :

s_log.Debug("CallerName");

НТН ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...