代码之家  ›  专栏  ›  技术社区  ›  Iain Fraser

在VS2008中有没有一种方法可以在手表或快速手表中搜索特定值?

  •  2
  • Iain Fraser  · 技术社区  · 16 年前

    假设我正在观看VS2008中的某些内容,并且我想搜索我正在观看的对象,以查找特定值的实例。

    例如,假设我正在观看 this mycontrol 在它里面或者我想搜索一个 string 它目前具有“Hello World”的价值。

    get_defined_vars()

    干杯 伊恩

    编辑:

    e、 g.应用程序抛出一个exeption,因为 foo 应该是类型的列表 bar . 我想知道在哪里 定义了,以便我可以四处查看,并查看同一类中的其他变量设置为什么。

    再次抱歉,我发现很难解释:(

    我发现一棵好树可能会帮助我更好地想象它。。。

    Quickwatch
    -this
     -var1
       +var1a
       +var1b
       -var1c
        -base
         -foo = "Hello World"
        +var1ca
     +var2
     +var3
    

    在上面的例子中,我将如何快速深入结构以找到 福

    4 回复  |  直到 16 年前
        1
  •  1
  •   Gregory    16 年前

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    
    public static class Dumper
    {
        public class Dump
        {
            public Dump(bool spacesInsteadOfTab)
            {
                _spacesIndeadOfTab = spacesInsteadOfTab;
            }
    
            private readonly StringBuilder _sb = new StringBuilder();
    
            public string Result
            {
                get
                {
                    return _sb.ToString();
                }
            }
    
            private readonly bool _spacesIndeadOfTab;
    
            private int _currentIndent;
            public int CurrentIndent
            {
                get
                {
                    return _currentIndent;
                }
                set
                {
                    _currentIndent = value > 0 ? value : 0;
                }
            }
    
            public void IncrementIndent()
            {
                CurrentIndent += 1;
            }
    
            public void DecrementIndent()
            {
                CurrentIndent -= 1;
            }
    
            private void AppendIndent()
            {
                if (_spacesIndeadOfTab)
                    _sb.Append(' ', _currentIndent * 4);
                else
                    _sb.Append('\t', _currentIndent);
            }
    
            public void Log(string logValue)
            {
                AppendIndent();
                _sb.AppendLine(logValue);
            }
    
            public void Log(string logValue, params object[] args)
            {
                AppendIndent();
                _sb.AppendFormat(logValue, args);
                _sb.AppendLine();
            }
        }
    
        public static Dump TakeDump(object objectToDump, int maxDepth)
        {
            Dump result = new Dump(false);
    
            int currentDepth = 0;
    
            TakeDump(ref result, ref currentDepth, maxDepth, objectToDump);
    
            return result;
        }
    
        private static void TakeDump(ref Dump result, ref int currentDepth, int maxDepth, object objectToDump)
        {
            currentDepth++;
            if (currentDepth > maxDepth)
            {
                result.IncrementIndent();
                result.Log("MaxDepth ({0}) Reached.", maxDepth);
                result.DecrementIndent();
                return;
            }
    
            var objectType = objectToDump.GetType();
            result.Log("--> {0}", objectType.FullName);
    
            result.IncrementIndent();
            var fields = objectType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    
            if (fields.Count() == 0)
                result.Log("No fields");
    
            foreach (var fieldInfo in fields)
            {
                var fieldValue = fieldInfo.GetValue(objectToDump);
    
                if (fieldValue == null)
                    result.Log("{0} is null", fieldValueType.FullName, fieldInfo.Name);
    
                var fieldValueType = fieldValue.GetType();
    
                if (fieldValueType.IsValueType)
                    result.Log("{2} as {0} (ToString: {1})", fieldValueType.FullName, fieldValue.ToString(), fieldInfo.Name);
                else
                    TakeDump(ref result, ref currentDepth, maxDepth, fieldValue);
            }
            result.DecrementIndent();
        }
    }
    
        2
  •  2
  •   Michael Petrotta user3140870    16 年前

    听起来你想要一份工作 conditional breakpoint :

    到达时,将对表达式求值 只有当

    创建一个新的断点,右键单击它,然后选择“条件…”输入要等待的条件。大概是这样的:

    this.MyString == "Hello World"
    

    Hawkeye :

    Hawkeye是唯一能够 允许您查看、编辑、分析和 从.Net调用(几乎)任何对象 应用只要你想 调试、测试、更改或理解

    自由的暂时没有更新。

        3
  •  2
  •   Omer Raviv    15 年前

    你可以用 BugAid (VisualStudio的附加组件),它允许 search

    请参见以下屏幕截图中的示例:

    Search Feature

    :我是“BugAid”的共同创作者。

        4
  •  0
  •   JaredPar    16 年前

    我认为您最好的选择是编写一个基于反射的搜索机制和深度控制机制。然后从调试器窗口调用此API。