Есть ли у кого-нибудь хорошее решение для С# версии макроса С++ __FUNCTION__? Компилятор, похоже, не нравится.
Версия С# макроса __FUNCTION__
Ответ 1
Попробуйте использовать это вместо этого.
System.Reflection.MethodBase.GetCurrentMethod().Name
С# не имеет макросов __LINE__
или __FUNCTION__
, таких как С++, но есть эквиваленты
Ответ 2
В настоящее время я использую такую функцию:
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") ]
вместо этого, но я не обошел это.
Благодаря Джеффу Мастри за его решение.
Ответ 3
К сожалению, нет эквивалентной версии этого макроса в С#. Я не считаю решение GetCurrentMethodName() эквивалентным макросу С++ __FUNCTION__. А именно, версия С++ - это вычисление времени компиляции имени. Для С# это расчет времени выполнения и приводит к поражению производительности.
Я не делаю никаких предположений о серьезности стоимости, но есть один
Ответ 4
Следующее должно работать, хотя оно будет оцениваться во время выполнения, а не во время компиляции.
System.Reflection.MethodBase.GetCurrentMethod().Name
Ответ 5
Это добавлено в .NET 4.5.
См. здесь @roken:
Ответ 6
Я использую это:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Пример использования:
s_log.DebugFormat("{0}", CallerName());
Нижняя сторона использования заключается в том, что каждый раз, когда вы хотите напечатать имя вызывающего абонента, вам нужно перейти к функции == > отнимать много времени и повысить производительность! Таким образом, я использую его для отладки perpose и, если мне нужно печатать также в производственном коде, я обычно встраиваю имя функции в log.Debug, например.
s_log.Debug("CallerName");
НТН..