Aqui está um exemplo do que eu quero fazer:
MessageBox.Show("Error line number " + CurrentLineNumber);
No código acima de CurrentLineNumber
, deve estar o número da linha no código-fonte deste trecho de código.
Como eu posso fazer isso?
c#
wpf
c#-4.0
line-numbers
MonsterMMORPG
fonte
fonte
Respostas:
No .NET 4.5 / C # 5, você pode fazer com que o compilador faça esse trabalho para você, escrevendo um método utilitário que usa os novos atributos do chamador:
Isso exibirá, por exemplo:
Também há o
[CallerFilePath]
que informa o caminho do arquivo de código original.fonte
Use o método StackFrame.GetFileLineNumber , por exemplo:
Consulte a entrada do blog de Scott Hanselman para obter mais informações.
[Editar: adicionado o seguinte]
Para aqueles que usam .Net 4.5 ou posterior, considere CallerFilePath , CallerMethodName e CallerLineNumber no namespace System.Runtime.CompilerServices. Por exemplo:
Os argumentos devem ser
string
paraCallerMemberName
eCallerFilePath
e umint
paraCallerLineNumber
e devem ter um valor padrão. Especificar esses atributos em parâmetros de método instrui o compilador a inserir o valor apropriado no código de chamada em tempo de compilação, o que significa que funciona por meio de ofuscação. Consulte Informações do chamador para obter mais informações.fonte
StackFrame
exemplo no Mono , certifique-se de usar--debug
em tempo de compilação e em tempo de execuçãoStackFrame
não está disponível no .NET Core. Use a resposta de Marc Gravell.= string.Empty
gera um erro "O valor do parâmetro padrão para 'callingFilePath' deve ser uma constante de tempo de compilação" !""
) em vez destring.Empty
.Eu prefiro um liners, então:
fonte
Para aqueles que precisam de uma solução de método .NET 4.0+:
Como ligar:
Resultado:
Altere o formato Console.WriteLine como quiser!
fonte
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
então você pode clicar na linha na janela de saída e ser levado para essa linha na fonte.Se estiver em um bloco try catch, use-o.
fonte
No .NET 4.5, você pode obter o número da linha criando a função:
Então, cada vez que você ligar,
LineNumber()
você terá a linha atual. Isso tem a vantagem sobre qualquer solução que usa o StackTrace de que deve funcionar tanto na depuração quanto na liberação.Então, pegando a solicitação original do que é necessário, ele se tornaria:
Isso se baseia na excelente resposta de Marc Gravell.
fonte