.NET 7中如何从JSON模型类生成格式化参数字符串
实现方案
1. 定义通用接口与默认实现
先定义IArguments接口,利用.NET 7的接口默认方法特性,把ToArguments()的通用逻辑写在接口里,所有实现该接口的类都能直接调用,不用重复编写代码:
using System.Reflection; using System.Text; public interface IArguments { string ToArguments() { StringBuilder sb = new StringBuilder(); // 获取当前类的所有公共实例属性 PropertyInfo[] properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in properties) { object? value = prop.GetValue(this); if (value == null) continue; // 跳过空值属性 // 处理值的格式:字符串类型加双引号,其他直接转字符串 string formattedValue = value is string str ? $"\"{str}\"" : value.ToString()!; // 拼接成指定格式的参数片段 sb.Append($" -argument {prop.Name}={formattedValue}"); } // 去掉开头多余的空格,返回结果 return sb.ToString().TrimStart(); } }
2. 创建JSON模型类并实现接口
你的JSON模型类只需实现IArguments接口,无需额外编写其他代码:
using System.Text.Json.Serialization; // 示例模型类 public class MyArgs : IArguments { [JsonPropertyName("propertyA")] public string PropertyA { get; set; } = string.Empty; [JsonPropertyName("propertyB")] public int PropertyB { get; set; } // 新增属性时直接添加,ToArguments()会自动适配 [JsonPropertyName("propertyC")] public bool PropertyC { get; set; } }
3. 反序列化后调用方法
用System.Text.Json反序列化得到实例后,直接调用ToArguments()即可生成目标参数字符串:
using System.Text.Json; // 示例JSON字符串 string json = @"{""propertyA"":""some text"",""propertyB"":123,""propertyC"":true}"; // 反序列化 MyArgs args = JsonSerializer.Deserialize<MyArgs>(json)!; // 生成参数字符串 string arguments = args.ToArguments(); // 输出结果:-argument PropertyA="some text" -argument PropertyB=123 -argument PropertyC=True
关键说明
- 反射的作用:这里用反射自动获取类的所有公共属性,新增属性时只要保持公共实例属性的定义,
ToArguments()会自动识别并处理,完全不用修改方法代码。 - 值格式处理:针对字符串类型自动添加双引号,其他类型直接调用
ToString(),如果需要支持更多类型(比如枚举、日期),可以在循环里添加对应的判断逻辑。 - 空值处理:跳过值为
null的属性,避免生成无效的参数片段。
内容的提问来源于stack exchange,提问作者master_ruko
相关产品推荐
相关产品推荐

