如何模拟 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);
}
}
}
结果:
一个例子:
如果我们在 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);
}
}
}
结果: