在C#与Salesforce场景下,如何获取JsonPropertyName字符串并以点表示法与其他字符串拼接?
在C#与Salesforce场景下,如何获取JsonPropertyName字符串并以点表示法与其他字符串拼接?
嘿,我来帮你搞定这个C#和Salesforce集成里的小问题!你肯定是在做Salesforce Web查询的时候,不想硬编码那些满是__r、__c的字段路径,而是想从实体类的JsonPropertyName注解里自动提取字段名,还能把嵌套的关联属性拼成点表示法的字符串对吧?这就给你一步步拆解解决方案。
第一步:先明确实体类的结构
首先你的实体类得标记好JsonPropertyName属性,对应Salesforce里的字段名,比如:
using System.Text.Json.Serialization; public class MyCustomUnicornEntity { [JsonPropertyName("Id")] public string Id { get; set; } [JsonPropertyName("dragon__r")] public DragonEntity Dragon { get; set; } [JsonPropertyName("knight__r")] public KnightEntity Knight { get; set; } } public class DragonEntity { [JsonPropertyName("dragon_fire_color__c")] public string FireColor { get; set; } } public class KnightEntity { [JsonPropertyName("knigth_armour__r")] // 保留你原代码里的拼写 public ArmourEntity Armour { get; set; } } public class ArmourEntity { [JsonPropertyName("armour_steel_type__c")] public string SteelType { get; set; } }
第二步:写个反射工具方法提取JsonPropertyName
我们需要一个工具方法,通过反射拿到属性上标记的JsonPropertyName值,如果没标记就用属性本身的名字(做个兜底):
using System.Reflection; using System.Text.Json.Serialization; public static class JsonPropertyHelper { public static string GetJsonPropertyName(Type type, string propertyName) { var property = type.GetProperty(propertyName); if (property == null) throw new ArgumentException($"找不到类型{type.Name}上的属性{propertyName}"); var jsonAttr = property.GetCustomAttribute<JsonPropertyNameAttribute>(); // 如果有JsonPropertyName就用它,否则返回属性名 return jsonAttr?.Name ?? propertyName; } }
第三步:拼接嵌套属性的点表示法路径
有了上面的工具方法,我们就可以一步步拼接嵌套属性的路径了。比如要获取knight__r.knigth_armour__r.armour_steel_type__c这个路径:
// 逐层获取每个属性的JsonPropertyName var knightJsonName = JsonPropertyHelper.GetJsonPropertyName(typeof(MyCustomUnicornEntity), nameof(MyCustomUnicornEntity.Knight)); var armourJsonName = JsonPropertyHelper.GetJsonPropertyName(typeof(KnightEntity), nameof(KnightEntity.Armour)); var steelTypeJsonName = JsonPropertyHelper.GetJsonPropertyName(typeof(ArmourEntity), nameof(ArmourEntity.SteelType)); // 用点号拼接成完整路径 var fullFieldPath = $"{knightJsonName}.{armourJsonName}.{steelTypeJsonName}"; // 最终结果就是 "knight__r.knigth_armour__r.armour_steel_type__c"
进阶:写个递归方法自动处理任意嵌套深度
如果你的嵌套层级比较多,手动逐层拼接太麻烦,可以写个迭代方法,直接传入属性的嵌套路径(比如Knight.Armour.SteelType),自动生成完整的点表示法字段路径:
public static class JsonPropertyHelper { public static string GetJsonPropertyName(Type type, string propertyName) { var property = type.GetProperty(propertyName); if (property == null) throw new ArgumentException($"找不到类型{type.Name}上的属性{propertyName}"); var jsonAttr = property.GetCustomAttribute<JsonPropertyNameAttribute>(); return jsonAttr?.Name ?? propertyName; } public static string GetNestedJsonPropertyPath(Type rootType, string nestedPropertyPath) { var propertySegments = nestedPropertyPath.Split('.'); var currentType = rootType; var pathParts = new List<string>(); foreach (var propName in propertySegments) { var jsonName = GetJsonPropertyName(currentType, propName); pathParts.Add(jsonName); // 更新当前类型为下一层属性的类型 currentType = currentType.GetProperty(propName).PropertyType; } return string.Join(".", pathParts); } } // 使用示例 var fullPath = JsonPropertyHelper.GetNestedJsonPropertyPath( typeof(MyCustomUnicornEntity), $"{nameof(MyCustomUnicornEntity.Knight)}.{nameof(KnightEntity.Armour)}.{nameof(ArmourEntity.SteelType)}" ); // 同样得到目标路径
最后说两句
这种方式的好处是完全避免硬编码Salesforce字段名,减少拼写错误,而且如果Salesforce字段名改了,你只需要修改实体类的JsonPropertyName注解,不用到处找硬编码的字符串,代码维护起来方便多了。
备注:内容来源于stack exchange,提问作者FrankOfTheScience
相关产品推荐
相关产品推荐

