Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 我怎样才能知道谁(隐式地)调用了我的ToString?_C#_.net_Tostring - Fatal编程技术网

C# 我怎样才能知道谁(隐式地)调用了我的ToString?

C# 我怎样才能知道谁(隐式地)调用了我的ToString?,c#,.net,tostring,C#,.net,Tostring,我的类需要额外的信息才能正确地输出其状态,因此我添加了一个使用适当参数的自定义PrintSelf方法 然而,我担心在我的大型项目中仍然有对ToString的调用,这些调用没有被新方法取代。我怎样才能找到那些对ToString的不正确调用 我使用的是VS 2015,但它似乎没有这种能力 在ToString中抛出异常是一种显而易见的方法,但我不想这样做,原因有二: ToString仍然可以执行不同的作业并输出不依赖于添加的参数的内容 没有办法获得完整的代码覆盖率,这意味着它只能找到几个隐式调用实例,

我的类需要额外的信息才能正确地输出其状态,因此我添加了一个使用适当参数的自定义PrintSelf方法

然而,我担心在我的大型项目中仍然有对ToString的调用,这些调用没有被新方法取代。我怎样才能找到那些对ToString的不正确调用

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

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

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

  • 没有办法获得完整的代码覆盖率,这意味着它只能找到几个隐式调用实例,但不能(可靠地)找到所有实例


  • 要覆盖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();
        }
    
    您可以使用:

    因此,这将让您在VisualStudio中了解对该函数的所有调用。因为它只是一个警告,所以仍然可以使用它


    (注意:如果语法不正确,很抱歉,我通常是VB.Net开发人员,如果需要,请随时更正。)

    记录调用堆栈?为什么不重写ToString而不是使用PrintSelf呢?
    ToString
    的思想是给出实例的文本表示。这永远不需要外部输入,因为外部输入不是实例的一部分。放置一个断点并检查调用堆栈,其想法是默认情况下类无法充分了解其环境(环境可能随时更改),因此必须提供它。ToString本身对于基本信息来说很好,但是对于完整的图片,需要第二个带有参数的自定义方法。如果有人仍然只调用ToString,它将生成无效的输出。@mafu听起来您的对象应该正在实现。谢谢,这是一个好主意,解决了我提到的两个问题中的第一个问题(ToString仍然适用于不需要更复杂输出的调用方)。--可悲的是,这并不能解决第二个问题(完整的代码覆盖率)。我不知道你所说的获得所有代码是什么意思?此方法将使您能够将每个调用方记录到ToString方法?您是否可以控制调用此tostring方法的所有源代码?(在这种情况下,您可以使用overidden方法上的find usage search在您的解决方案中查找它们。我的意思是,这需要全部(im-或显式)对ToString的调用将在执行期间被实际调用。我不能保证这一点,因为代码库太大,无法检查每一行是否存在可能的调用。当我使用Visual Studio的“查找引用”时,我会得到对任何类(不仅仅是我的类)的任何显式(非隐式)ToString的所有调用,这与我需要的非常不同。对你来说有什么不同吗?那么我一定是错误配置了我的VS。你能测试这个吗?安装jetbrains resharper,然后实现tostring覆盖方法,然后在覆盖的方法上使用find usage advanced,我想它应该能够找到你要找的东西。我不认为这会elp,调用
    String.Format(“{0}”,myFirstClass);
    将使用
    .ToString()
    ,但不会引发编译器警告/错误。我认为Scott是对的,但无论如何,这是一个好主意-它提供了显式调用的自动静态分析,并且至少应该防止意外添加(显式)调用ToString@ScottChamberlain是正确的,但至少(如@mafu所述)用户将被警告不要使用它。。。
    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
        }
    }