私はいくつかの内部ロギング フレームワークに取り組んでおり、パフォーマンスのために、遅延して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 をステップ実行することです。
より良い解決策があることを本当に願っています。