我怎样才能找出谁(隐含地)调用我的ToString?

时间:2016-09-28 12:28:34

标签: c# .net tostring

我的课程需要其他信息才能正确输出其状态,因此我添加了一个自定义的PrintSelf方法,并采用了相应的参数。

但是,我担心在我的大型项目中仍然会调用ToString,而这些调用并没有被新方法取代。如何找到对ToString的不正确调用?

我使用VS 2015,但它似乎没有这种能力。

在ToString中抛出异常是一种显而易见的方式,但我不想这样做有两个原因:

  1. ToString仍然可以执行不同的作业并输出不依赖于添加的参数的内容。

  2. 无法获得完整的代码覆盖率,这意味着它只会找到一些隐式调用的实例,但不会(可靠地)找到所有这些实例。

2 个答案:

答案 0 :(得分:4)

要覆盖ToString并记录调用者,您可以这样做

    public override string ToString()
    {
        StackTrace stackTrace = new StackTrace();           
        StackFrame[] stackFrames = stackTrace.GetFrames();  

        StackFrame callingFrame = stackFrames[1];
        MethodInfo method = callingFrame.GetMethod();
        YourLogingMethod(method.DeclaringType.Name + "." + method.Name);

        return base.ToString();
    }

答案 1 :(得分:1)

您可以使用Obsolete Attribute

public class MyFirstClass
{
    //true or false parameters indicates whether to throw 
    // a compile error (true) or warning (false)
    [Obsolete("Please use the method PrintSelf() instead of ToString()", false)]
    public overrides string ToString()
    {
        //Whatever code you want here
        return "";
    }
}

public class MySecondClass
{
    public void Test()
    {
        mfc = new MyFirstClass();
        mfc.ToString(); //Here you will get a compiler warning
    }
}

因此,这将让您在Visual Studio中了解对此函数进行的所有调用。由于它只是一个警告,它仍然可以使用它。

(注意:如果语法不正确,我很抱歉,我通常是一个VB .Net开发者,如果需要,可随意更正。)