Я работаю над некоторой внутренней структурой ведения журналов, и ради производительности кажется хорошей идеей лениво получить 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);
Результаты непредсказуемы, так как стек вызовов изменен. Есть ли в любом случае, чтобы добраться до локального объема / рамки через закрытие, сохраняя при этом лень.
Единственное решение, которое я могу придумать, - это пройти через StackTrace, пока я не обнаружу первый кадр неизвестным методом.
Я действительно надеюсь, что есть лучшее решение.