C versão # de __FUNCTION__ macro
Pergunta
Alguém tem uma solução boa para uma versão C # do C ++ __FUNCTION__ macro? O compilador não parece como ele.
Solução
Tente usar isso em vez.
System.Reflection.MethodBase.GetCurrentMethod().Name
C # não tem __LINE__
ou __FUNCTION__
macros, como C ++, mas existem equivalentes
Outras dicas
O que eu uso atualmente é uma função como esta:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
Quando preciso __FUNCTION__, eu só chamar o __Function () em vez. Por exemplo:
Debug.Assert(false, __Function() + ": Unhandled option");
É claro que esta solução usa a reflexão também, mas é a melhor opção que eu posso encontrar. Desde que eu só usá-lo para depuração (não Tracing em compilações) o impacto no desempenho não é importante.
Acho que o que deve fazer é criar funções de depuração e tag-los com
[ Conditional("Debug") ]
Em vez disso, mas eu não tenho tempo para isso.
Infelizmente não existe uma versão equivalente do que macro em C #. Eu não considero a solução GetCurrentMethodName () equivalente ao C ++ __FUNCTION__ macro. Ou seja becase o C ++ versão é uma compilação tempo de computação do nome. Para C # isto é um cálculo de tempo de execução e incorre um impacto no desempenho.
Eu não estou fazendo nenhuma assumtions sobre a gravidade do custo, mas há um
A seguir deve funcionar, embora possa ser avaliada em tempo de execução em vez de durante a compilação.
System.Reflection.MethodBase.GetCurrentMethod().Name
Este é adicionado em .NET 4.5.
Veja a resposta da @ roken aqui:
Eu uso este:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Exemplo de uso:
s_log.DebugFormat("{0}", CallerName());
O lado negativo de usá-lo é que cada vez que você deseja imprimir o nome do chamador, você precisa ir para a função ==> demorado e acerto de desempenho! Então, eu usá-lo para depurar perpose e se eu precisar imprimir também no código de produção, geralmente em linha o nome da função no log.debug, por exemplo, :
s_log.Debug("CallerName");
HTH ..