Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# Visual Studio-调试大量对象列表_C#_Visual Studio - Fatal编程技术网

C# Visual Studio-调试大量对象列表

C# Visual Studio-调试大量对象列表,c#,visual-studio,C#,Visual Studio,我正在调试一个应用程序,在某个时刻,我有一个包含大量项目的列表,这使我无法一步一步地查看每个元素。我想用PropertyName=“XXX”检查元素的属性层中的值。有什么简单的方法可以做到这一点吗 外部代码: var metadata = FieldsConfigurationProvider.GetAllFieldsConfiguration(); RequestDocumentTypeModel model = new RequestDocumentTypeModel() { Re

我正在调试一个应用程序,在某个时刻,我有一个包含大量项目的列表,这使我无法一步一步地查看每个元素。我想用PropertyName=“XXX”检查元素的属性层中的值。有什么简单的方法可以做到这一点吗

外部代码:

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是不允许的。我正在使用VisualStudio2010,但据我所知,其他版本也有同样的“问题”

我想检查元素的属性层中有什么值 PropertyName=“XXX”。有什么简单的方法可以做到这一点吗

可以,您可以指定断点条件。然后,它仅在满足条件时停止

就你而言:

PropertyName == "XXX"


请记住,您从不指定类似于
PropertyName=“XXX”
的条件,因为这样会以静默方式更改变量值。

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

如果需要立即检查整个列表,请尝试
MetadataItems中的
RequestDocumentMetadataItem


[DebuggerDisplay(“DisplayName={DisplayName}PropertyName={PropertyName}”)]

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

  • 按照此答案中的建议使用System.Linq.Dynamic表达式:
  • 等待Visual Studio 2015()

  • 您可以尝试在对象类型的
    列表
    周围编写一个小包装器,并给它一个基于字符串的
    []
    重载访问器。像这样:

    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" });
        }
    }
    
    公共类ComplexType
    {
    公共字符串PropertyName{get;set;}
    公共字符串层{get;set;}
    公共字符串DisplayName{get;set;}
    }
    公共类调试列表:列表
    {
    public ComplexType此[字符串键]
    {
    得到
    {
    返回此.FirstOrDefault(i=>i.PropertyName==key);
    }
    }
    }
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var myList=new DebuggableList();
    添加(新的ComplexType{DisplayName=“XXX”,Layer=“YYY”,PropertyName=“ZZZ”});
    添加(新的ComplexType{DisplayName=“AAA”,Layer=“BBB”,PropertyName=“CCC”});
    添加(新的ComplexType{DisplayName=“DDD”,Layer=“EEE”,PropertyName=“FFF”});
    }
    }
    

    在“监视”窗口中,您可以使用
    myList[“XXX”]
    访问所需的对象,然后将显示
    PropertyName
    ==“XXX”的对象。

    也许右键单击代码中的行,选择并用注释明确指定属性名称,例如:


    然后,您可以在输出窗口中检查这一点。它的美妙之处在于,您不需要编译任何额外的代码,并且可以在运行时的任何时候对其进行更改。

    您是否可以编写一个函数,从输入
    PropertyName
    中返回所需的内容,然后在调试时在quickwatch中运行它?您在寻找什么?Tim关于使用条件中断的建议可能是正确的(+1),但我怀疑当你得到一个对任何事情都是错误的值时,你应该使用它来中断reason@leppie-谢谢:)这很有帮助。是的,的确如此,但问题是,我不想每次检查列表中的某些属性时都编写循环。“我的代码”不处理此项列表。@fka:您不需要更改代码,可以在调试期间指定断点条件。您不需要编译代码。只有当条件满足时,它才会停止。我编辑了我的问题。也许我不太理解你们的答案,但当我把断点放在指定的位置(当然这一行并没有实际注释)并把contition:model.MetadataItems.PropertyName==“XXX”放进去时,应该可以了吧?我不这么认为,因为MetadataItems没有属性PropertyName-列表中的项目有。@Fka:所以如果列表中的任何项目有
    ,实际上您想停止。PropertyName==“XXX”
    ?如果不更改代码,那么确实很困难,因为您无法在调试器中使用LINQ。我将添加一个局部变量
    boolcontainspropname=model.MetadataItems.Any(I=>I.PropertyName==“XXX”)。然后可以指定使用
    containsPropName
    的断点条件。否。正如我在问题中提到的,我只想用
    PropertyName=“XXX”
    以简单的方式检查项目的
    Layer
    属性的值是多少。这就是全部。