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