C# 如何使用惰性工具创建可预测的输出<;StackFrame>;

C# 如何使用惰性工具创建可预测的输出<;StackFrame>;,c#,.net,logging,system.diagnostics,diagnostics,C#,.net,Logging,System.diagnostics,Diagnostics,我正在开发一些内部日志框架,为了提高性能,懒洋洋地获得StackFrame似乎是个好主意。我想使用这个StackFrame来获取日志框架之外的第一个方法 我最初的想法是: using System; using System.Diagnostics; using NUnit.Framework; [TestFixture] public class Test { [Test] public void Caller() { NeedsToNowCaller

我正在开发一些内部日志框架,为了提高性能,懒洋洋地获得
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);
    }
}
结果是不可预测的,因为调用堆栈已更改。无论如何,在保持惰性的同时,是否可以通过闭包获得本地范围/框架的挂钩

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


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

我不知道这是否更好,但与其寻找未知的方法,不如寻找不同的源类。这有点粗糙,但是希望这项工作在进入日志类之前为您提供最后一帧,而不必维护“已知”方法名称列表(假设日志方法不是静态的


我编写了这样一个记录器。所有额外数据都会自动添加。没有必要使用
惰性
@Xaqron为什么没有必要?为每个日志消息创建StackFrame会带来开销,因为这些属性并不总是被访问。@JJoos:当没有发生异常时,为什么日志
StackFrame
?如果发生
异常
,您已经拥有
堆栈帧
@Xaqron,因为如果发生错误,它并不总是异常。我还想知道日志记录发生在哪里。@JJoos:如果发生错误,您应该抛出
exception
,然后处理它。这就是例外存在的原因。关于异常源,您是对的,您需要
StackFrame
,并且已经有一个附加到您的
exception
    Really();
    Assert.AreEqual("Caller", Processor.stackFrame.Value.GetMethod().Name);
public void DoStuff()
{
    int index = 0;
    StackFrame frame = new StackFrame(index++);
    while (this.GetType().Name.Equals(frame.GetMethod().DeclaringType.Name))
    {
        frame = new StackFrame(index++);
    }
    //...
}