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