C#调试 - 查找特定值而不知道它在哪个属性中

4
我的问题是:如果我知道对象的一个属性值为“example”,在调试时如何找到该属性,而无需检查对象的每个可能属性?
我认为我表述不太清楚。例如,我有一个ImagePart对象。在调试时,我想查看TargetName的值。为了做到这一点,我应该将鼠标悬停在对象上,然后悬停在非公共成员上。但是,如果我想要查看的值更深入,我就很难找到它。

也许你需要将所有属性添加到监视窗口中,并查看是否发生了问题。 - V4Vendetta
我不认为有任何内置的功能,但您考虑过使用宏吗?也许在调试器中,有一种方法可以迭代类型字段/属性列表? - Richard
如果有它的地址,可以尝试使用CheatEngine进行检查。但它可能与你寻找的东西差距很大。 - SBoss
3个回答

4
如果我理解正确,您有一个具有许多属性的对象,那么您可以在该类中创建一个方法,使用C#反射“扫描”所有属性。
请在要分析的对象的类中创建以下方法:
    string PropertyThatHasCertainValue(object Value)
    {
        Type myType = this.GetType();

        while(myType != typeof(object))
        {
            foreach (PropertyInfo property_info in myType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
            {
                if (object.Equals(property_info.GetValue(this, null), Value))
                {
                    return property_info.Name;
                }
            }
            myType = myType.BaseType;
        }
        return "No property has this value";
    }

然后在观察窗口中,添加以下观察项:
MyObjectInstance.PropertyThatHasCertainValue(ValueYouAreLookingFor)
请注意,您可能想使用除了object以外的其他内容作为参数,以使在观察时更容易输入。但是,在VS观察窗口中,您不仅可以轻松输入数字和字符串,还可以输入枚举。Visual Studio观察非常强大,它们几乎总是能正确地评估表达式。
我已经添加了while循环,以递归地遍历所有父级。 BindingFlags.NonPublic将返回类的所有私有和受保护方法,但不包括基类的私有方法。通过遍历所有基类,直到找到Object为止,可以解决此问题。

请注意,此代码不会深入挖掘属性值是对象的情况;如果“属性更深”,则无法正常工作,正如OP所说。 - Omer Raviv
@OmerRaviv 我不明白为什么这样做不行,只要你能在监视窗口中定义这样的对象(所以应该在一行内完成)。例如,您可以键入 MyObjectInstance.PropertyThatHasCertainValue(new MyObjectWithUsefulConstructor("足够的参数来构造对象的深层属性"))。VS Watches非常强大(特别是针对较新的VS版本,如2008/2010)。 - zmilojko

-1

这并没有回答楼主的问题。 - Omer Raviv
@Omer:你怎么知道上面的评论没有回答他的问题。大多数最初的回复都是关于添加quickWatch/watch窗口的。如果它们也不正确,那么我会说问题本身就是含糊不清的。我看到了你在链接中提供的答案。即使在那里,你也在做类似的事情,只是你使用了其他工具。如果你的答案是正确的,那么我可以说使用MOLE(http://weblogs.asp.net/pawanmishra/archive/2009/12/13/mole-visual-studio-visualizer.aspx)。 - Pawan Mishra
请不要误会 - 你的博客文章非常棒!但是如果我理解正确,OP的问题是:“在调试时,如何根据属性名称或属性值查找属性?”仅固定属性只有在您已经找到感兴趣的属性时才有用。我同意使用Mole也是回答OP问题的另一个完全有效的方法。 - Omer Raviv

-1
一个类似的问题已经在这里被问到过。请看那里的我的回答:我所说的搜索功能对属性值的工作方式与对属性名称的方式相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接