c# - generate - ¿Cómo obtengo el número de línea actual?
params comments c# (7)
En .NET 4.5 / C # 5, puede hacer que el compilador haga este trabajo por usted, escribiendo un método de utilidad que use los nuevos atributos del llamante:
static void SomeMethodSomewhere()
{
ShowMessage("Boo");
}
...
static void ShowMessage(string message,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
MessageBox.Show(message + " at line " + lineNumber + " (" + caller + ")");
}
Esto mostrará, por ejemplo:
Boo en la línea 39 (SomeMethodSomewhere)
También hay [CallerFilePath]
que le indica la ruta del archivo de código original.
Aquí hay un ejemplo de lo que quiero hacer:
MessageBox.Show("Error line number "+CurrentLineNumber);
El número de línea actual será el número de línea en el código fuente de este fragmento de código.
¿Cómo puedo hacer eso?
En .NET 4.5, puede obtener el número de línea creando la función:
static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
return lineNumber;
}
Luego, cada vez que llame a LineNumber()
tendrá la línea actual. Esto tiene la ventaja sobre cualquier solución que use StackTrace de que funcione tanto en depuración como en versión.
Entonces, tomando la solicitud original de lo que se requiere, se convertiría en:
MessageBox.Show("Error enter code here line number " + LineNumber());
Esto se basa en la excelente respuesta de Marc Gravell.
Esto funciona para mí:
try
{
//your code;
}
catch(Exception ex)
{
MessageBox.Show(ex.StackTrace + " ---This is your line number, bro'' :)", ex.Message);
}
Para aquellos que necesitan una solución de método .NET 4.0+:
using System;
using System.IO;
using System.Diagnostics;
public static void Log(string message) {
StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
string fileName = stackFrame.GetFileName();
string methodName = stackFrame.GetMethod().ToString();
int lineNumber = stackFrame.GetFileLineNumber();
Console.WriteLine("{0}({1}:{2})/n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}
Como llamar:
void Test() {
Log("Look here!");
}
Salida:
Prueba de vacío () (NOMBRE DE ARCHIVO.cs: 104)
¡Mira aquí!
Cambia el formato Console.WriteLine como quieras!
Prefiero uno, así que:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
Si está en un bloque try catch usa esto.
try
{
//Do something
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
Utilice el método StackFrame.GetFileLineNumber , por ejemplo:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
Consulte la entrada del blog de Scott Hanselman para obtener más información.
[Editar: Se agregó lo siguiente]
Para aquellos que usan .Net 4.5 o posterior, considere los CallerFilePath , CallerMethodName y CallerLineNumber en el espacio de nombres System.Runtime.CompilerServices. Por ejemplo:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = string.Empty,
[CallerFilePath] string callingFilePath = string.Empty,
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Los argumentos deben ser una string
para CallerMemberName
y CallerFilePath
y una int
para CallerLineNumber
y debe tener un valor predeterminado. Especificar estos atributos en los parámetros del método indica al compilador que inserte el valor apropiado en el código de llamada en tiempo de compilación, lo que significa que funciona a través de la ofuscación. Vea la información de la persona que llama para más información.