Visual Studio - 调试巨大的对象列表

时间:2015-05-22 07:40:01

标签: c# visual-studio

我正在调试一个应用程序,在某个时刻,我有一个包含大量项目的列表,这使我无法一步一步地观察每个元素。我想检查 PropertyName =" XXX"的元素 Layer 内的值是什么。有没有简单的方法呢?

Screenshot

外部代码:

var metadata = FieldsConfigurationProvider.GetAllFieldsConfiguration();
RequestDocumentTypeModel model = new RequestDocumentTypeModel()
{
    Requester = CurrentUser.Login,
    MetadataItems = metadata.Where(f => !f.IsSystemGenerated).Select(f => new RequestDocumentMetadataItem(f.DocumentModelPropertyName, f.DisplayName, false, f.Layer)).ToList()
};

// BREAKPOINT HERE
// # MORE CODE #

当然我不能使用立即窗口和LINQ,因为LINQ是不允许的。我使用的是Visual Studio 2010,但据我所知,其他版本也有相同的问题"。

6 个答案:

答案 0 :(得分:3)

  

我想检查属性Layer里面的元素是什么值   PropertyName =“XXX”。有没有简单的方法呢?

是的,您可以指定断点条件。然后只有在满足条件时它才会停止。

在你的情况下:

PropertyName == "XXX"

How to: Specify a Breakpoint Condition

请记住,您从未指定类似PropertyName = "XXX"的条件,因为它会静默更改变量值。

答案 1 :(得分:2)

如果您需要一次查看整个列表,请在RequestDocumentMetadataItem

中的MetadataItems上尝试DebuggerDisplayAttribute

[DebuggerDisplay("DisplayName = {DisplayName} PropertyName = {PropertyName}")]

答案 2 :(得分:1)

我可以建议两种解决方法:

  1. 按照此答案中的建议使用System.Linq.Dynamic表达式:https://stackoverflow.com/a/2771843/245452
  2. 等待Visual Studio 2015(http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/12/support-for-debugging-lambda-expressions-with-visual-studio-2015.aspx

答案 3 :(得分:1)

您可以尝试在对象类型的List周围编写一个小包装器,并为其提供一个基于字符串的[]重载访问器。像这样:

public class ComplexType
{
    public string PropertyName { get; set; }
    public string Layer { get; set; }
    public string DisplayName { get; set; }
}

public class DebuggableList : List<ComplexType>
{
    public ComplexType this[string key]
    {
        get
        {
            return this.FirstOrDefault(i => i.PropertyName == key);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var myList= new DebuggableList();

        myList.Add(new ComplexType { DisplayName = "XXX", Layer = "YYY", PropertyName = "ZZZ" });
        myList.Add(new ComplexType { DisplayName = "AAA", Layer = "BBB", PropertyName = "CCC" });
        myList.Add(new ComplexType { DisplayName = "DDD", Layer = "EEE", PropertyName = "FFF" });
    }
}

在观察窗口中,您可以使用myList["XXX"]访问所需对象,并使用PropertyName ==&#34; XXX&#34;将会显示。

答案 4 :(得分:1)

也许右键单击代码中的行,选择Breakpoint -> Insert Tracepoint,并明确指定带有注释的属性名称,例如:

enter image description here

然后您可以在输出窗口中检查它。它的美妙之处在于您不需要编译任何其他代码,您可以在运行时随时更改它。

答案 5 :(得分:0)

您可以编写一个带有辅助函数的静态调试类来进行调试。有一些扩展可以帮助调试VS本身,但我认为没有一个是免费的。