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

C#动态获取类属性值处理TMDB反序列化多季剧集数据问题问询

解决方案

两种方案都可以完全消除你现在要写几十个重复foreach的问题,方案一从架构层面优化更推荐使用,方案二适合需要保留现有类结构的场景,改动量最小。

方案一(更推荐,无需定义冗余SeasonX类)

你原来的类定义存在大量重复的Season1/Season2空类,完全可以通过JSON反序列化配置直接消除这些冗余,后续季数变动也无需修改类结构:

  1. 改造MultiSeasons类如下:
public class MultiSeasons
{      
    public Season[] seasons { get; set; }    

    // 存储JSON中未匹配到显式定义的所有字段
    [JsonExtensionData]
    private IDictionary<string, JToken> _extensionData;

    // 所有季数据统一存在该字典中,key为季数,value为季详情
    [JsonIgnore]
    public Dictionary<int, CommonProperties> AllSeasons { get; set; } = new();

    // 反序列化完成后自动将season/x格式的字段转换为CommonProperties存入字典
    [OnDeserialized]
    private void AfterDeserialized(StreamingContext context)
    {
        if (_extensionData == null) return;
        foreach (var kv in _extensionData)
        {
            if (!kv.Key.StartsWith("season/")) continue;
            if (int.TryParse(kv.Key.Split('/')[1], out int seasonNum))
            {
                var season = kv.Value.ToObject<CommonProperties>();
                if (season != null)
                {
                    AllSeasons[seasonNum] = season;
                }
            }
        }
    }
}
  1. 反序列化与后续遍历逻辑直接简化为:
// 不需要再手动替换JSON里的season/字符串,避免误替换其他内容
MultiSeasons ser = JsonConvert.DeserializeObject<MultiSeasons>(json);
DataTable dt = new DataTable();
// 原有添加列逻辑保留

foreach (var season in ser.AllSeasons.Values)
{
    if (season?.episodes == null) continue;
    foreach (var r in season.episodes)
    {
        DataRow dr = dt.NewRow();
        dr["id"] = ser.id;
        dr["firstAired"] = r.air_date;
        dr["season"] = r.season_number;
        // 其余字段赋值逻辑保留
        dt.Rows.Add(dr);
    }
}

方案二(保留原有类结构,用反射消除重复代码)

如果你不想调整现有类定义,直接通过反射遍历MultiSeasons实例的所有季属性即可,无需逐个写判断:

MultiSeasons ser = JsonConvert.DeserializeObject<MultiSeasons>(json);
DataTable dt = new DataTable();
// 原有添加列逻辑保留

// 筛选出所有继承自CommonProperties的属性,也就是你定义的season1、season2等
var seasonProperties = ser.GetType().GetProperties()
    .Where(p => typeof(CommonProperties).IsAssignableFrom(p.PropertyType))
    .ToList();

foreach (var prop in seasonProperties)
{
    var season = prop.GetValue(ser) as CommonProperties;
    if (season?.episodes == null) continue;
    foreach (var r in season.episodes)
    {
        DataRow dr = dt.NewRow();
        dr["id"] = ser.id;
        dr["firstAired"] = r.air_date;
        dr["season"] = r.season_number;
        // 其余字段赋值逻辑保留
        dt.Rows.Add(dr);
    }
}

内容的提问来源于stack exchange,提问作者Zath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:12:00