Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StackTrace,fluent呼叫的线路信息_C#_Stack Trace - Fatal编程技术网

C# StackTrace,fluent呼叫的线路信息

C# StackTrace,fluent呼叫的线路信息,c#,stack-trace,C#,Stack Trace,给定以下fluent API调用: Foo() .Bar1(() => { ... }) .Bar2(() => { ... }) .Bar3(); 我想确定Bar1、Bar2和Bar3行的代码文件和行号,然后向下(呃…向上)它们的调用堆栈 案例1:…在Bar1/Bar2/Bar3扩展方法中 我目前的解决方案是:我立即在这些方法中创建一个堆栈跟踪并找到信息 开放性问题:行信息属于Foo()行,而不是条(…)-行:( 案例2:…稍后,在代码的其他地方,以防给定

给定以下fluent API调用:

Foo()
    .Bar1(() => { ... })
    .Bar2(() => { ... })
    .Bar3();
我想确定Bar1、Bar2和Bar3行的代码文件和行号,然后向下(呃…向上)它们的调用堆栈

案例1:…在Bar1/Bar2/Bar3扩展方法中

我目前的解决方案是:我立即在这些方法中创建一个堆栈跟踪并找到信息

开放性问题:行信息属于
Foo()
行,而不是
条(…)
-行:(

案例2:…稍后,在代码的其他地方,以防给定的委托在执行时引发异常

我当前的解决方案是:检查异常的堆栈跟踪并找到正确的行:)

特例3:Bar3在方法内部定义了委托,现在我仍然希望在此类委托引发异常时使用
.Bar3()

我目前的解决方案:还不知道,委托是在其他地方创建的,我不能使用与案例2中相同的方法。我唯一的机会是案例1中的信息,但是,这些信息并不完全正确(错误的行号)

Q:您知道如何在这三种情况下确定正确的代码文件和行号吗

注意:性能与测试无关,因为这是测试框架的一部分。

.NET 4.5包括以下几种更简洁的方法:

using System.Runtime.CompilerServices;

...

public Foo Bar1(
    Action, 
    [CallerMemberName] string memberName = "",
    [CallerFilePath] string sourceFilePath = "",
    [CallerLineNumber] int sourceLineNumber = 0)
{
    ...
}
这里最大的好处是您不必在运行时做任何事情。参数是在编译时提供的,因此这对方法的性能没有影响。不幸的是,没有任何东西可以阻止用户代码绕过它,例如:

Foo().Bar1(() => { ... }, "not a real method", "not a real file", -123);

您的代码实际上是一行,因此信息本身并没有错。你需要把它分开:

var foo = Foo();
var bar1 = foo.Bar1(() => { ... });
var bar2 = bar1.Bar2(() => { ... });
var bar3 = bar2.Bar3();
这是我能想到的最简单、最快的“修复”。您也可以利用
区域
s来提高清晰度:

#if(DEBUG)
// When compiling in debug
var foo = Foo();
var bar1 = foo.Bar1(() => { ... });
var bar2 = bar1.Bar2(() => { ... });
var bar3 = bar2.Bar3();
// additional code might be needed, depending on the real code...
#else
// When compiling in Release
Foo()
    .Bar1(() => { ... })
    .Bar2(() => { ... })
    .Bar3();
#endif

据我所知,这整行代码都与一行代码有关。。我猜VisualStudio调试器也这么认为。我认为您必须将其拆分为3个单独的方法调用您可以在委托上设置断点,即使您必须先选择它然后设置断点。虽然我的用户不打算覆盖那些方法参数(攻击他们自己的脚…),但我也会+1你的答案,这确实让我的API“脏”了。因此,我们也欢迎您提供任何其他答案。谢谢您的回答,但是,这对我的API用户来说更糟糕;-)