如何模拟 C# Interactive Console 中的对象打印?

How to simulate the printing of object like in C# Interactive Console?

一个例子:

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

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

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

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

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

从 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);

Returns:

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

Fiddle: https://dotnetfiddle.net/XzHHoN

在评论部分感谢@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);
        }
    }
}

结果: