【问题标题】:How to simulate the printing of object like in C# Interactive Console?如何在 C# 交互式控制台中模拟对象的打印?
【发布时间】:2021-12-10 14:54:09
【问题描述】:

一个例子:

如果我们在 C# 控制台中键入 scoreDir,它的内容会被打印得很漂亮,即对象的定义、它的长度和它的数据。

我想用 内置 .NET 方法来模拟这种打印,例如ToString()。但是,如图所示,ToString() 不起作用。 “模拟”意味着我可以生成相同的打印字符串,但将其存储在变量中。微软一定使用了一些函数来打印这样的对象;最好只是重复使用该功能(不要重新发明轮子)。

【问题讨论】:

  • 据我所知,.NET 中没有任何内置功能可以为您做到这一点。这很可能是内置在交互式控制台应用程序中的。
  • 虽然不如交互式控制台好(甚至不如record.ToString())我经常发现自己打电话给JsonSerializer.Serialize(myObject),因为生成的JSON比输出更有用-在大多数情况下,现成的.ToString()
  • 序列化 ConcurrentDictionary 有几个限制,从错误到您可以在 S.O. 中检查的其他问题。或 Google,所以我将回答有关 Newtonsoft 和 .NET 6.0 的问题,请查看我的回答中的注释
  • @DCAggie JsonSerializer.Serialize 在这种情况下不起作用
  • 添加this Nuget package,生成带有Microsoft.CodeAnalysis.CSharp.Scripting.Hosting.CSharpObjectFormatter.Instance.FormatObject(scoredir)的字符串;

标签: c# c#-interactive


【解决方案1】:

在评论部分感谢@Hans Passant

在 Visual Studio 中,安装 Nuget 包 Microsoft.CodeAnalysis.CSharp.Scripting 后,可以使用静态函数 Microsoft.CodeAnalysis.CSharp.Scripting.Hosting.CSharpObjectFormatter.Instance.FormatObject() 模拟与 C# 交互控制台相同的输出。

这是有效的代码:

using System;
using System.IO;
using System.Collections.Concurrent;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var scoreDir = new ConcurrentDictionary<(int, int), (double, int)>();
            scoreDir.TryAdd((1, 2), (0.9, 3));
            var res = Microsoft.CodeAnalysis.CSharp.Scripting.Hosting.CSharpObjectFormatter.Instance.FormatObject(scoreDir);
            Console.WriteLine(res);
        }
    }
}

结果:

【讨论】:

    【解决方案2】:

    没有这样的构建工具,但您可以将其转换为 Json。您的示例的问题对于 ConcurrentDictionary 来说并不那么容易。

    重要提示:
    这仅适用于Newtonsoft.NET 6.0,因为System.Text.Json 不提供用于序列化到JSON ConcurrentDictionary 的强制转换,这也不适用于.NET Framework 中的Newtonsoft

    如何将 ConcurrentDictionary 序列化为 JSON 字符串?

    从 Nugget 导入 Newtonsoft.Json

    using Newtonsoft.Json;添加到文件头部的引用

    ConcurrentDictionary<(int,int), (double,int)> scoreDir = new ConcurrentDictionary<(int,int), (double,int)>();
    scoreDir.TryAdd((1,2),(0.9,3));
    string jsonString = JsonConvert.SerializeObject(scoreDir);
    Console.WriteLine(jsonString);
    

    返回:

    {"(1, 2)":{"Item1":0.9,"Item2":3}}

    小提琴:https://dotnetfiddle.net/XzHHoN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多