C# 如何使一段数据可用于调用堆栈下的其他函数?
对于某些特定的日志记录需求,我想生成一个变量,可能是一个GUID,让我能够识别该函数。 然后,我想在调用堆栈的另一个函数中访问该变量,而不修改调用堆栈中原始函数的函数签名 这是可能的还是有意义的 上下文: 我正在生成一些日志,希望将调用者“链接”到这些日志 正在顺流调用的函数。在来电者中,我能够 编写一些日志或为当前函数分配一些特定ID。 然而,在调用堆栈中,我似乎可以访问任何 除了使用StackTrace的基本信息之外,来自“调用者”的信息 让我们想象一下,我有一些像这样的呼叫链 () =>B() =>=>C() 我怎么知道C()的当前实例正在被特定的A()调用调用调用,而不将A()的GUID沿着调用堆栈传递给B()然后传递给C() 我做了一些研究,但结果似乎陈旧,不一定符合目前的情况了C# 如何使一段数据可用于调用堆栈下的其他函数?,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,对于某些特定的日志记录需求,我想生成一个变量,可能是一个GUID,让我能够识别该函数。 然后,我想在调用堆栈的另一个函数中访问该变量,而不修改调用堆栈中原始函数的函数签名 这是可能的还是有意义的 上下文: 我正在生成一些日志,希望将调用者“链接”到这些日志 正在顺流调用的函数。在来电者中,我能够 编写一些日志或为当前函数分配一些特定ID。 然而,在调用堆栈中,我似乎可以访问任何 除了使用StackTrace的基本信息之外,来自“调用者”的信息 让我们想象一下,我有一些像这样的呼叫链 () =>B
好吧……作为评论:你在试图做一些不该做的事情。也就是说,您希望将一个值传递给被调用的函数,但不是通过使用推送到连续堆栈帧上的参数的常规方法 我不会就此做出判断,但它确实指向了一个可能的解决方案:您可以在代码中重新创建函数调用堆栈机制。换句话说,在每个方法中都有一个堆栈全局变量,并将方法名称和GUID推送到堆栈上。然后,在示例方法C中,您可以遍历堆栈以查找A的调用实例的GUID。假设您在多任务环境中工作,您可能还希望推送当前任务id和/或为每个线程或每个任务创建单独的堆栈
正如您所指出的,StackTrace.GetFrame(i)已经完成了这类工作,但它只提供了基本信息,比如方法的名称。然而,这仍然足够,取决于你的情况。例如,您可以一直走到堆栈跟踪的底部,以找到的所有活动实例以及它们的调用来源 看看可用的解决方案,这似乎是一个广泛使用的功能。对于NET标准,使用了
System.Runtime.Remoting.Messaging.CallContext
提供与执行代码路径一起携带的一组属性
对于.NET Core,System.Threading.AsyncLocal
可用
表示给定异步控件的本地环境数据
流,例如异步方法
在中可以看到完整的实现
我们还可以从NLog中得到启发,NLog似乎利用上述两种解决方案在逻辑范围内实现全面的消息传递机制为什么不能仅使用包含类的字段/属性来存储数据?NLog允许您使用映射的诊断逻辑上下文来实现这一点。我认为您可以使用,也许,但这是标记的.Net Core,我不太熟悉。在类级别创建GUID属性您需要访问它还是只用于日志,因为听起来您想要@ZaelinGoodman谢谢您的输入。我正在寻找一个解决方案,需要较少的变化在类。我不确定这是否适用于静态函数,加上类级别的GUID将在同一“对象”上的不同函数调用之间共享?你们都认为我目前的要求有意义吗/这是一个有趣的案例吗?谢谢你们的回答。我确信我正在尝试做的是非常不正常的。答案给了我一些有趣的想法。。。