您只询问了行号和可为空的项目类型,然后您需要使用类似这样的东西
internal class Utils
{
public static int Line([CallerLineNumber] int? lineNumber =null)=>lineNumber;
}
在您的代码中,如果您想获取行号,则只需调用
var line=Utils.Line();
如果你正在记录并且你想在记录中记录行号而不是调用这样的方法
public void MyMethod(int someValue)
{
switch(someValue)
{
case 1:
if(abc<xyz)
{
logger.LogInformation("case value {someValue} this line {line} was true", someValue ,Utils.Line()-2);
}
break;
case 2:
logger.LogInformation("case value {someValue} this {line} was executed",someValue,Utils.Line());
break;
caste 3:
logger.LogInformation("case value {someValue} this {line} was executed",someValue,Utils.Line());
break;
}
}
您可以使用任何其他 [CallerXXX] 方法扩展此模式,而不是在任何地方使用它们,而不仅仅是在方法参数中。
在 Nuget 包Walter 中,我使用了一个超酷的类,名为 ExceptionObject
如果您导入 NuGet 包,您将在 Exception 类上有一些不错的扩展方法,并且可以访问显示调用链的 CallStack,包括方法参数和所有调用方法的参数值。
这就像一堆异常,只有值显示你是如何得到你得到什么值的地方。
public void MyMethod()
{
try
{
//get me all methods, signatures, parameters line numbers file names etc used as well as assembly info of all assemblies used for documentation of how the code got here
var stack= new CallStack();
foreach( var frame in StackedFrames)
{
logger.LogDebug(frame.ToString());
}
}
catch(SqlException e)
{
var ex = new ExceptionObject(e);
logger.LogException(e,"{this} exception due to {message} {server} {procedure} TSQL-line:{sqlline}\n{TSQL}"
,e.GetType().Name
,e.Message
,ex.SqlServer
,ex.SqlProcedureName
,ex.SqlLineNumber
,ex.Tsql
,ex.CallStack);
}
catch(Exception e)
{
var ex = new ExceptionObject(e);
logger.LogException(e,"{this} exception due to {message} signature: signature}\nCallStack:", e.GetType().Name,e.Message,ex.Signature,ex.CallStack);
}
}