惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
The Cloudflare Blog
N
Netflix TechBlog - Medium
GbyAI
GbyAI
Help Net Security
Help Net Security
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
Martin Fowler
Martin Fowler
量子位
P
Palo Alto Networks Blog
Security Latest
Security Latest
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
H
Help Net Security
C
Check Point Blog
T
Troy Hunt's Blog
C
CERT Recently Published Vulnerability Notes
Y
Y Combinator Blog
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
V
Visual Studio Blog
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Announcements
Recent Announcements
Forbes - Security
Forbes - Security
IT之家
IT之家
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
L
LangChain Blog
AWS News Blog
AWS News Blog
N
News and Events Feed by Topic
Stack Overflow Blog
Stack Overflow Blog
H
Hacker News: Front Page
B
Blog
W
WeLiveSecurity
罗磊的独立博客
Jina AI
Jina AI
博客园 - 【当耐特】

博客园 - Hey,Coder!

Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容 ubuntu24.04 安装docker RAG 检索增强生成 软考 - 架构设计师 知识点总结 c# MailKit3.4.3 发送邮件、附件 nginx 反向代理postgresql c# 信号量 elsa 3.5 中间件记录最后执行的节点数据 xp密钥 c# System.Text.Json 反序列化Dictionary<string,object>时未转换基础类型的处理方法 docker配置代理 openclaw 接入 LMStudio的模型服务 wpf canvas 移动 缩放 windows平台openclaw搭建 wpf scrollerview触摸滚动 c# 动态切换sqlsugar连接字符串 c# Elastic.Clients.Elasticsearch 动态查询 c# es 封装Elastic.Clients.Elasticsearch c# scrollerview滚动到指定元素位置 WPF 重写Expander 基于elsa工作流封装一套变量、组件的体系 常用活动重写 DynamicExpresso 轻量级动态表达式库 c# elsa 3.5.2 程序化工作流常用功能及自定义中间件 leaflet docker 连接老版本的sqlserver ssl错误 c# quartz 动态创建任务 控制任务运行和停止 依赖注入 cefsharp 模拟点击 批量重置数据库的数据 docker 复制远程镜像本地并创建容器 c# newtonsoft dynamic
c# 生成对象的初始化代码
Hey,Coder! · 2026-07-20 · via 博客园 - Hey,Coder!

使用方法,
string code = InitializerCodeGenerator.GenerateInitializer(this);
例如:

  public class ParaParseConfig
  {
      public string ParaNo { get; set; }
      public JsonDataType ParaType { get; set; }

      public List<ParaParseConfig> Sub { get; set; }

      public string GetCode()
      {
          string code = InitializerCodeGenerator.GenerateInitializer(this);

          return code;
      }
  }

完整代码



    public static class InitializerCodeGenerator
    {
        public static string GenerateInitializer(object obj)
        {
            if (obj == null) return "null";
            var sb = new StringBuilder();
            BuildExpression(obj, sb, 0, new HashSet<object>(ReferenceEqualityComparer.Instance));
            return sb.ToString().TrimEnd('\r', '\n');
        }

        private static void BuildExpression(object obj, StringBuilder sb, int indent, HashSet<object> visited)
        {
            if (obj == null)
            {
                sb.Append("null");
                return;
            }

            if (visited.Contains(obj))
            {
                sb.Append("/* circular reference */");
                return;
            }

            Type type = obj.GetType();

            // 基本类型 / 字符串 / 枚举 / 可空类型 → 直接输出字面量
            if (IsSimpleType(type))
            {
                sb.Append(GetLiteral(obj));
                return;
            }

            // 可空类型(已经包含在 IsSimpleType 中,但单独处理也可)
            Type underlying = Nullable.GetUnderlyingType(type);
            if (underlying != null)
            {
                sb.Append(GetLiteral(obj));
                return;
            }

            visited.Add(obj);

            // 数组
            if (type.IsArray)
            {
                var arr = (Array)obj;
                Type elemType = type.GetElementType();
                sb.Append($"new {GetTypeName(elemType)}[{arr.Length}]{{");
                for (int i = 0; i < arr.Length; i++)
                {
                    if (i > 0) sb.Append(", ");
                    BuildExpression(arr.GetValue(i), sb, indent + 1, visited);
                }
                sb.Append("}");
                return;
            }

            // 泛型集合
            if (typeof(IEnumerable).IsAssignableFrom(type) && type.IsGenericType)
            {
                var enumerable = (IEnumerable)obj;
                var genericArgs = type.GetGenericArguments();

                // 字典
                if (type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary<,>)))
                {
                    var dict = (IDictionary)obj;
                    sb.Append($"new {GetTypeName(type)}(){{");
                    bool first = true;
                    foreach (DictionaryEntry entry in dict)
                    {
                        if (!first) sb.Append(", ");
                        first = false;
                        sb.Append("{ ");
                        BuildExpression(entry.Key, sb, indent + 1, visited);
                        sb.Append(", ");
                        BuildExpression(entry.Value, sb, indent + 1, visited);
                        sb.Append(" }");
                    }
                    sb.Append("}");
                }
                else // List, HashSet, Queue, Stack ...
                {
                    sb.Append($"new {GetTypeName(type)}(){{");
                    bool first = true;
                    foreach (var item in enumerable)
                    {
                        if (!first) sb.Append(", ");
                        first = false;
                        BuildExpression(item, sb, indent + 1, visited);
                    }
                    sb.Append("}");
                }
                return;
            }

            // 普通类 / 结构体 → 对象初始化器
            sb.AppendLine($"new {GetTypeName(type)}()");
            sb.AppendLine(new string(' ', indent * 4) + "{");

            // 公共可写属性(不含索引器)
            foreach (var prop in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                                     .Where(p => p.CanWrite && p.GetIndexParameters().Length == 0))
            {
                object value = prop.GetValue(obj);
                if (value == null) continue;
                sb.Append(new string(' ', (indent + 1) * 4));
                sb.Append($"{prop.Name} = ");
                BuildExpression(value, sb, indent + 1, visited);
                sb.AppendLine(",");
            }

            // 公共字段
            foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                object value = field.GetValue(obj);
                if (value == null) continue;
                sb.Append(new string(' ', (indent + 1) * 4));
                sb.Append($"{field.Name} = ");
                BuildExpression(value, sb, indent + 1, visited);
                sb.AppendLine(",");
            }

            sb.Append(new string(' ', indent * 4) + "}");
        }

        private static bool IsSimpleType(Type t)
        {
            if (t.IsPrimitive || t == typeof(string) || t.IsEnum || t == typeof(decimal) ||
                t == typeof(DateTime) || t == typeof(Guid) || t == typeof(TimeSpan) ||
                t == typeof(Uri) || t == typeof(Version))
                return true;
            Type underlying = Nullable.GetUnderlyingType(t);
            return underlying != null && IsSimpleType(underlying);
        }

        private static string GetLiteral(object value)
        {
            if (value == null) return "null";
            Type t = value.GetType();
            if (t == typeof(string)) return $"\"{EscapeString((string)value)}\"";
            if (t == typeof(char)) return $"'{value}'";
            if (t == typeof(bool)) return (bool)value ? "true" : "false";
            if (t.IsEnum) return $"{t.FullName}.{value}";
            if (t == typeof(decimal)) return $"{value}m";
            if (t == typeof(float)) return $"{value}f";
            if (t == typeof(double)) return $"{value}d";
            if (t == typeof(long)) return $"{value}L";
            if (t == typeof(uint)) return $"{value}u";
            if (t == typeof(ulong)) return $"{value}UL";
            if (t == typeof(DateTime)) return $"new DateTime({((DateTime)value).Ticks}L)";
            if (t == typeof(Guid)) return $"new Guid(\"{value}\")";
            if (t == typeof(TimeSpan)) return $"new TimeSpan({((TimeSpan)value).Ticks}L)";
            if (t == typeof(Uri)) return $"new Uri(\"{value}\")";
            if (t == typeof(Version)) return $"new Version(\"{value}\")";
            if (Nullable.GetUnderlyingType(t) != null)
            {
                var nullable = value as dynamic;
                return nullable.HasValue ? GetLiteral(nullable.Value) : "null";
            }
            return value.ToString(); // fallback
        }

        private static string EscapeString(string s)
        {
            return s.Replace("\\", "\\\\")
                    .Replace("\"", "\\\"")
                    .Replace("\n", "\\n")
                    .Replace("\r", "\\r")
                    .Replace("\t", "\\t");
        }

        private static string GetTypeName(Type type)
        {
            if (!type.IsGenericType) return type.FullName ?? type.Name;
            var sb = new StringBuilder();
            sb.Append(type.GetGenericTypeDefinition().FullName?.Split('`')[0]);
            sb.Append("<");
            var args = type.GetGenericArguments();
            for (int i = 0; i < args.Length; i++)
            {
                if (i > 0) sb.Append(", ");
                sb.Append(GetTypeName(args[i]));
            }
            sb.Append(">");
            return sb.ToString();
        }
    }