如何将stacktrace行拆分为命名空间,类,方法文件和行号?

C#堆栈跟踪采用以下forms:

at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21 at Foo.Core.Test.AnotherMethod(Bar bar) at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6 at Foo.Core.Test.c__DisplayClass7.b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35 

如何从每一行检索命名空间,类,方法,文件和行号?

  • 有没有现成的课程要做?
  • 如果不是最好的方法是什么?
  • 正则表达式? 我如何贪婪地匹配命名空间但保留类和方法?
  • 自定义解析器?

会欣赏一些想法和意见。

如果你是从StackTrace获取的,那么你可以通过GetFrame 遍历StackFrames并调用GetMethod , GetFileName和GetFileLineNumber 。 可以从方法中检索命名空间和类。

编辑
在回应第一条注释时( 不幸的是我们从Exception.StackTrace获取了跟踪 ),您可以调用StackTrace(Exception)构造函数。

编辑
我应该链接到这个构造函数 – StackTrace(Exception,bool) 。

我读了Austin Salonen的答案,这显然更好,但我已经开始使用正则表达式了。 所以无论如何我都会写。

 Regex r = new Regex(@"at (?.*)\.(?.*)\.(?.*(.*)) in (?.*):line (?\d*)"); var result = r.Match(@"at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21"); if (result.Success) { string _namespace = result.Groups["namespace"].Value.ToString(); string _class = result.Groups["class"].Value.ToString(); string _method = result.Groups["method"].Value.ToString(); string _file = result.Groups["file"].Value.ToString(); string _line = result.Groups["line"].Value.ToString(); Console.WriteLine("namespace: " + _namespace); Console.WriteLine("class: " + _class); Console.WriteLine("method: " + _method); Console.WriteLine("file: " + _file); Console.WriteLine("line: " + _line); } 

StackTraceParser可以将堆栈跟踪文本输出(例如,通常由Environment.StackTrace或Exception.StackTrace返回)解析回堆栈跟踪帧序列,包括以下组件:

 Type Method Parameter types and names File and line information, if present 

它可以作为NuGet源包直接嵌入到C#项目中。

但是,它需要指定一些函数,并且它的使用并不是很明显。

 public static IEnumerable Parse( string text, Func tokenSelector, Func methodSelector, Func parameterSelector, Func, TParameters> parametersSelector, Func sourceLocationSelector, Func selector) 

请参阅https://github.com/atifaziz/StackTraceParser和https://bitbucket.org/project-elmah/main/src/2a6b0b5916a6b4913ca5af4c22c4e4fc69f1260d/src/Elmah.AspNet/ErrorDetailPage.cs?at=default&fileviewer=file-view中的示例-默认