gpt4 book ai didi

c# - 如何使用 Lazy 创建可预测的输出

转载 作者:行者123 更新时间:2023-11-30 18:43:22 28 4
gpt4 key购买 nike

我正在开发一些内部日志记录框架,为了性能起见,懒惰地获取 StackFrame 似乎是个好主意。我想使用此 StackFrame 获取我的日志记录框架之外的第一个方法。

我最初的想法是这样的:

using System;
using System.Diagnostics;
using NUnit.Framework;

[TestFixture]
public class Test
{
[Test]
public void Caller()
{
NeedsToNowCaller();
}

public void NeedsToNowCaller()
{
Processor.GetName(() => new StackFrame(4));

Really();
Assert.AreEqual("Caller", Processor.stackFrame.Value.GetMethod().Name);
}

public void Really()
{
Assert.AreEqual("Caller",Processor.stackFrame.Value.GetMethod().Name);
}
}

public static class Processor
{
public static Lazy<StackFrame> stackFrame;

public static void GetName(Func<StackFrame> stackFrameProvider)
{
stackFrame = new Lazy<StackFrame>(stackFrameProvider);
}
}

但是当你交换这些行时:

    Really();
Assert.AreEqual("Caller", Processor.stackFrame.Value.GetMethod().Name);

结果不可预测,因为调用堆栈已更改。有没有办法通过闭包 Hook 到本地范围/框架,同时保持惰性。

我能想到的唯一解决方案是单步执行 StackTrace,直到我用未知方法检测到第一帧。

我真的希望有更好的解决方案。

最佳答案

我不知道这样更好,但是与其寻找未知的方法,不如寻找不同的源类可能更简单。这有点粗糙,但是这样的事情是否可以在进入日志记录类之前为您提供最后一帧,而不必维护“已知”方法名称列表(假设日志记录方法不是静态的...)?

public void DoStuff()
{
int index = 0;
StackFrame frame = new StackFrame(index++);
while (this.GetType().Name.Equals(frame.GetMethod().DeclaringType.Name))
{
frame = new StackFrame(index++);
}
//...
}

关于c# - 如何使用 Lazy<StackFrame> 创建可预测的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486333/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com