如何将 C# 字典输出为 C# 代码?

How to Output a C# Dictionary as C# code?

如何将字典转换为定义该字典的 C# 代码? (类似于 python 中的 repr()。)

示例:

var dict = new Dictionary<int, string> {
    { 4, "a" },
    { 5, "b" }
};

Console.WriteLine(dict.ToCsharpString());

输出:

Dictionary<int, string> {
    { 4, "a" },
    { 5, "b" }
}

我对包含基本类型的字典最感兴趣。

类似问题Most efficient Dictionary.ToString() with formatting?(关注效率),有没有方便的将字典转换为字符串的方法? (需要不同的输出格式)。

基于Gabe's answer一个相关问题,这里有一个扩展方法解决方案:

public static string ToCsharpString<TKey,TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> items) {
    StringBuilder str = new StringBuilder();

    string type_name = items.GetType().Name;
    int index = type_name.LastIndexOf('`');
    if (index == -1) {
        index = type_name.Length;
    }
    str.Append(type_name, 0, index);
    str.AppendFormat("<{0}, {1}>", typeof(TKey).Name, typeof(TValue).Name);
    str.Append(" {\n");

    foreach (var item in items) {
        str.AppendFormat("\t{{ {0}, {1} }},\n", ToLiteral(item.Key), ToLiteral(item.Value));
    }
    str.Append("}");

    return str.ToString(); 
}

static string ToLiteral(object obj) {
    string input = obj as string;
    if (input == null)
        return obj.ToString();

    // 
    using (var writer = new StringWriter()) {
        using (var provider = CodeDomProvider.CreateProvider("CSharp")) {
            provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
            return writer.ToString();
        }
    }
}

输出略有不同,因为它打印框架 Class 库类型而不是基本类型(Int32 而不是 int),但它工作得很好:

Dictionary<Int32, String> {
    { 4, "a" },
    { 5, "b" },
}

Try it out.

改进空间:

  • 处理嵌入式字典的递归(但由于防止无限递归的复杂性,我认为这不值得)。
  • 也许为非原始类型打印一些更好的东西?