Pergunta

Alguém tem uma solução boa para uma versão C # do C ++ __FUNCTION__ macro? O compilador não parece como ele.

Foi útil?

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.

Graças a Jeff Mastry para seu 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:

Do __LINE__ __FILE__ existem equivalentes em C #?

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 ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top