【问题标题】:How do I use the LINQPad Dump() extension method in Visual Studio? [closed]如何在 Visual Studio 中使用 LINQPad Dump() 扩展方法? [关闭]
【发布时间】:2010-04-23 14:47:16
【问题描述】:

LINQPad 非常棒,特别有用的是 Dump() 扩展方法,它可以将几乎任何类型的对象和结构(匿名或非匿名)呈现到控制台。

最初,当我迁移到 Visual Studio 2010 时,我尝试使用委托创建自己的 Dump 方法,以获取要为匿名类型等渲染的值。虽然它变得非常复杂,但它既有趣又具有教育意义首先,我需要一个可靠的实现。在检查了.NET Reflector 中的 LINQPad 代码后,我更加确信我不会正确实现。

我可以包含一个免费的库来提供Dump 功能吗?

【问题讨论】:

  • 这个问题不应该被关闭,因为它没有引发辩论、争论、投票或扩展讨论
  • 我从这里看到了 linqpad 中的转储方法:--- linqpad.net, --- i.imgur.com/7j2WdZw.png 我认为这是在 linqpad 中使用的一种非常特殊的方法,所以我不认为在真正的 C# 中有简单的方法来做到这一点。作为它的描述,它可以自动将 img 转换为 img,将日历转换为日历,在实际代码中必须有很多对象类型决策
  • 我看一下 ObjectDumper,它最后使用的是使用 TextWriter 类的 Write 方法,所以我认为它所做的只是将所有对象写入字符串可能不会做你做的事情想要。

标签: c# linqpad


【解决方案1】:

我为 Object 编写了一个扩展方法,它使用带有漂亮格式选项的 Json.Net 序列化程序。像这样格式化时,JSON 很容易阅读。你错过了类型信息,但我不知道你需要那个,特别是考虑到这很容易。还没有让我失望。我使用 Json.Net 而不是 MS',因为它能够处理复杂图中的循环引用,而 MS' 不能,或者在我想到它的时候没有。

using Newtonsoft.Json;

public static class Dumper
{
    public static string ToPrettyString(this object value)
    {
         return JsonConvert.SerializeObject(value, Formatting.Indented);
    }

    public static T Dump<T>(this T value)
    {
        Console.WriteLine(value.ToPrettyString());
        return value;
    }
}

【讨论】:

  • 要进一步模拟 LINQPad 的 Dump() 方法,请将此扩展方法添加到类中: public static T Dump(this T value) { Console.WriteLine(value.ToPrettyString());返回值; }
  • 如果有人调整它以使用System.Text.Json,尽管在这篇文章中有推理,除了类/对象名称之外唯一需要的更改是将new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = true };而不是Formatting.Indented传递给Serialize方法。 WriteIndented = true 将使用类似的格式来漂亮地打印结果字符串。
【解决方案2】:

看这里(您的路径可能会有所不同):

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\1033\CSharpSamples.zip\LinqSamples\ObjectDumper

【讨论】:

  • +1 非常方便的课程。我从来不知道那件事。我将把它复制到我的调试工具库中。谢谢
  • 我编译它并添加为我的项目的引用,但尝试构建时出现错误 - 当前上下文中不存在 ObjectDumper。你会怎么称呼它?是写一个扩展方法还是只是一个静态的。抱歉,我是 C# 新手。
【解决方案3】:

diceguyd30answer 来源于a discussion (especially Pat Kujawa's & anunay's comments),并描述了如何从 C# 和 VB.NET 调用 LINQPad 转储实现:

public static string DumpToHtmlString<T>(this T objectToSerialize)
{
    string strHTML = "";
    try
    {
        var writer = LINQPad.Util.CreateXhtmlWriter(true);
        writer.Write(objectToSerialize);
        strHTML = writer.ToString();
    }
    catch (Exception exc)
    {
        Debug.Assert(false, "Investigate why ?" + exc);
    }
    return strHTML;
}

【讨论】:

  • 作者是 IDisposable。
  • 这个方法的内容可以替换成LINQPad.Util.ToHtmlString(true, objectToSerialize)
  • @base2,您也可以将其作为单独的答案发布。
【解决方案4】:

还有a class library named ObjectDumper 作为 NuGet 包提供。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多