C#debug - 在不知道具有哪个属性的情况下查找某个值

时间:2011-11-07 08:37:36

标签: c# debugging .net-4.0

我的问题是:如果我知道对象的属性具有值“example”,那么在调试时如何在不检查对象的每个可能属性的情况下找到它的属性?

我觉得我有点不清楚。例如,我有一个ImagePart的对象。当我调试时,我想看到TargetName的值。要做到这一点,我应该将鼠标放在对象上,然后放在非公共成员上。但是,如果我想看到的价值更深,我找不到它。

3 个答案:

答案 0 :(得分: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将解决此问题。

答案 1 :(得分:-1)

使用VS 2010,您可以固定该属性。因此,下次当您点击调试点时,相应的值将自动突出显示。更多信息:http://weblogs.asp.net/pawanmishra/archive/2009/12/26/another-vs-2010-feature-pin-up.aspx

答案 2 :(得分:-1)

有人提出了类似的问题here。请在那里查看my answer:我正在讨论的搜索功能适用于属性值,就像属性名称一样。