如何从StackTrace获取正确的行号?

时间:2012-05-11 23:44:05

标签: c# visual-studio stack-trace

我正在编写自己的穷人测试框架。在我的控制台应用程序中,我有这个:

  static void Main(string[] args)
  {     // Line 12
     double adouble = 77;
     double expected = 70;
     TestingFramework.assertEquals<double>(expected, adouble - 7);  // Line 15
     TestingFramework.assertEquals<double>(expected, adouble - 6);  // Line 16
   }

在TestingFramework中我有这一行:

System.Console.WriteLine("Success, File {0}, Line {1}", 
   new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileName(), 
   new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileLineNumber());

但是当我运行测试时,它告诉我两个函数调用的FileLineNumber都是12。此外,它给我正确的文件名,所以我认为它引用了正确的框架。

有人可以告诉我如何让它向我报告发起呼叫的行号(15然后是16),而不是打开的电话号码(12)吗?

感谢。

2 个答案:

答案 0 :(得分:1)

附加到我的评论中,如下所示:

    foreach(var frame in StackTrace.GetFrames())
    { 
        System.Reflection.MethodBase method = frame.GetMethod ( );
        Type type = method.DeclaringType;
        // If this is what I am looking for
        if ( type.IsSubclassOf( typeof(TestClassBase)) ||  type != typeof ( TestClassBase) )
        {
            System.Console.WriteLine("Success, File {0}, Line {1}", frame.GetFileName(), frame.GetFileLineNumber());
            return;
        }
    }

答案 1 :(得分:0)

我已经找到问题以及如何解决它。

我在TestingFramework中重载了assertequals函数: 1)assertEquals(T expectedValue,T actualValue)和 2)assertEquals(T expectedValue,T actualValue,string comment)。

当客户端代码调用2-param函数时,该函数只调用3-param函数。这种不同的帧深度取决于它的调用方式。

所以我不得不添加

static int depth; 
输入函数时递增的

,退出时递减。这会将代码更改为:

new System.Diagnostics.StackTrace(true).GetFrame(depth).GetFileLineNumber()); 

现在有效。