通用对象调试器

本文关键字:调试器 对象 | 更新日期: 2023-09-27 18:34:29

我正在尝试编写一个通用函数,我可以将对象传递给它,它将打印出 c# 中的所有属性和值。

我已经尝试了很多这样的例子,还有一些像

    public void PrintProperties(object obj)
    {
        PrintProperties(obj, 0);
    }
    public void PrintProperties(object obj, int indent)
    {
        if (obj == null) return;
        string indentString = new string(' ', indent);
        Type objType = obj.GetType();
        PropertyInfo[] properties = objType.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            object propValue = property.GetValue(obj, null);
            if (property.PropertyType.Assembly == objType.Assembly)
            {
                Console.WriteLine("{0}{1}:", indentString, property.Name);
                PrintProperties(propValue, indent + 2);
            }
            else
            {
                Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
            }
        }
    }

    foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
        {
            string name = descriptor.Name;
            object value = descriptor.GetValue(obj);
            Console.WriteLine("{0}={1}", name, value);
        }

但是我想要的调试/日志文件中的一些对象包含 string[] 属性。 所有这些示例都输出这些

System.String[]

如果我有一个像这样的对象

class Thing
{
    public string Name { get; set; }
    public int Number { get; set; }
    public string[] Names { get; set; }
}

我希望在日志中看到像波纹管这样的日志,无论设置了什么值

Name: Test
Number: 3
Names[0]: Fred
Names[1]: John
Names[2]: Jimmy

谢谢你的任何帮助=]

这是我最终使用的类

class Descriptor
{
    public void PrintProperties(object obj)
    {
        PrintProperties(obj, 0);
    }
    public void PrintProperties(object obj, int indent)
    {
        if (obj == null) return;
        string indentString = new string(' ', indent);
        Type objType = obj.GetType();
        PropertyInfo[] properties = objType.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            object propValue = property.GetValue(obj, null);
            if (propValue.GetType().IsArray)
            {
                object[] arrary = (object[]) propValue;
                foreach (string value in arrary)
                {
                    if (property.PropertyType.Assembly == objType.Assembly)
                    {
                        Console.WriteLine("{0}{1}:", indentString, property.Name);
                        PrintProperties(value, indent + 2);
                    }
                    else
                    {
                        Console.WriteLine("{0}{1}: {2}", indentString, property.Name, value);
                    }
                }
                continue;
            }
            if (property.PropertyType.Assembly == objType.Assembly)
            {
                Console.WriteLine("{0}{1}:", indentString, property.Name);
                PrintProperties(propValue, indent + 2);
            }
            else
            {
                Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
            }
        }
    }
}

现在我将在此类中使用 Log4Net,现在在我的 mvc3 站点中,我可以调用它,提供和发布 ViewModel 以在打开时进行全面的调试

通用对象调试器

如果你不介意使用 Windows 窗体,有一个叫做 PropertyGrid 的控件基本上可以执行您想要的操作:http://msdn.microsoft.com/en-us/library/system.windows.forms.propertygrid(v=vs.90(.aspx

现在,对于您的特定问题,问题是您没有查看数组内部。您应该做的是查看每个属性的类型。如果是数组类型,则需要将值强制转换为object[]数组,然后循环访问每个元素,而不是简单地打印值的ToString()输出。您还需要创建一个递归算法,该算法查看每个属性的内部,并将其视为具有要迭代的属性的对象。如果您需要帮助,请告诉我。