You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:05:30