C#动态获取类属性值处理TMDB反序列化多季剧集数据问题问询
解决方案
两种方案都可以完全消除你现在要写几十个重复
foreach的问题,方案一从架构层面优化更推荐使用,方案二适合需要保留现有类结构的场景,改动量最小。
方案一(更推荐,无需定义冗余SeasonX类)
你原来的类定义存在大量重复的Season1/Season2空类,完全可以通过JSON反序列化配置直接消除这些冗余,后续季数变动也无需修改类结构:
- 改造
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; } } } } }
- 反序列化与后续遍历逻辑直接简化为:
// 不需要再手动替换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
相关产品推荐
相关产品推荐

