Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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# 列出对象属性,如VisualStudio即时窗口_C#_Reflection - Fatal编程技术网

C# 列出对象属性,如VisualStudio即时窗口

C# 列出对象属性,如VisualStudio即时窗口,c#,reflection,C#,Reflection,我在会话中存储了一些类。我希望能够在跟踪查看器中查看类属性的值。默认情况下,我只使用类型名MyNamespace.MyClass。我想知道我是否覆盖了.ToString()方法,并使用反射来循环所有属性并构造这样的字符串。。。它可以做到这一点,但只是想看看是否有什么东西已经存在了(特别是因为即时窗口有这个功能),它也有同样的功能。。。i、 e.在跟踪中列出类属性值,而不仅仅是类的名称。您可以尝试以下方法: static void Dump(object o, TextWriter output)

我在会话中存储了一些类。我希望能够在跟踪查看器中查看类属性的值。默认情况下,我只使用类型名MyNamespace.MyClass。我想知道我是否覆盖了.ToString()方法,并使用反射来循环所有属性并构造这样的字符串。。。它可以做到这一点,但只是想看看是否有什么东西已经存在了(特别是因为即时窗口有这个功能),它也有同样的功能。。。i、 e.在跟踪中列出类属性值,而不仅仅是类的名称。

您可以尝试以下方法:

static void Dump(object o, TextWriter output)
{
    if (o == null)
    {
        output.WriteLine("null");
        return;
    }

    var properties =
        from prop in o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
        where prop.CanRead
        && !prop.GetIndexParameters().Any() // exclude indexed properties to keep things simple
        select new
        {
            prop.Name,
            Value = prop.GetValue(o, null)
        };

    output.WriteLine(o.ToString());
    foreach (var prop in properties)
    {
        output.WriteLine(
            "\t{0}: {1}",
            prop.Name,
            (prop.Value ?? "null").ToString());
    }
}
当然,这不是很有效,因为反射。。。更好的解决方案是为每个特定类型动态生成和缓存转储程序方法


编辑:这里有一个改进的解决方案,它使用Linq表达式为每种类型生成专门的转储程序方法。稍微复杂一点;)


这是我使用的代码。我发现它非常有用,而且几乎是即时的。代码使用的是Newtonsoft JSON转换器

    [System.Obsolete("ObjectDump should not be included in production code.")]
    public static void Dump(this object value)
    {
        try
        {
            System.Diagnostics.Trace.WriteLine(JsonConvert.SerializeObject(value, Formatting.Indented));
        }
        catch (Exception exception)
        {
            System.Diagnostics.Trace.WriteLine("Object could not be formatted. Does it include any interfaces? Exception Message: " + exception.Message);
        }
    }
将其添加到公共库中,引用它并将其添加到using子句中。可以通过键入YourObject.Dump()在即时窗口中使用(与在linqpad中的操作完全相同)

包含接口的类必须以不同方式处理,因为这只是一个JSON转换器。对于包含我使用的接口实现的类,一个变通方法是删除默认的空构造函数,并使用接口的特定实例实现构造函数


我发现JSON是一个非常容易阅读的格式,考虑这个小方法对于调试来说是非常宝贵的。

托马斯,谢谢,这看起来是一个很好的解决方案,但我仍然使用.NET 3.5,所以像TraceTelable,Expple,Buffor()等不允许我编译。
Dumper.Dump(myObject, Console.Out);
    [System.Obsolete("ObjectDump should not be included in production code.")]
    public static void Dump(this object value)
    {
        try
        {
            System.Diagnostics.Trace.WriteLine(JsonConvert.SerializeObject(value, Formatting.Indented));
        }
        catch (Exception exception)
        {
            System.Diagnostics.Trace.WriteLine("Object could not be formatted. Does it include any interfaces? Exception Message: " + exception.Message);
        }
    }