需求是,同一类型的两个对象A,B, 合并为C, 要求:A所有字段及其嵌套字段有值的话,将来自A的值赋给C,若没有值的话,将来自B的值赋给C。一开始我想使用反射遍历所有子字段成员去完成这个工作,但是实际尝试之后发现其中逻辑分支比较多,尤其是对泛型的处理,导致很复杂而不好实现。后来调整思路,对对象的所有字段操作还是序列化后的Json比较方便,于是使用JToken去完成了这个工作。自己觉得这种思路是应该记录下来的,因而发布本。代码如下,(个人水平不高,欢迎提出改进意见)
【需要引用Newtonsoft.Json.Linq】
private T MixObjects<T>(T object1, T object2)
{
var JToken1 = JToken.FromObject(object1);
var JToken2 = JToken.FromObject(object2);
RecursivelyChangeJtokenSubPropertiesValue(JToken1, JToken2);
return JToken2.ToObject<T>();
}
private void RecursivelyChangeJtokenSubPropertiesValue(JToken src, JToken dts)
{
if (src.Type == JTokenType.Array)
{
if (dts.SelectToken(src.Path) as JArray == null)
dts.SelectToken(src.Path).Replace(src);
else foreach (var item in src as JArray)
{
if (item.Children().Count() == 0 && item.Type != JTokenType.Null)
dts.SelectToken(item.Path).Replace(item.Value<Object>() as JToken);
else
RecursivelyC

本文介绍了如何使用C#将两个相同类型的对象A和B融合成一个新的对象C。当A的字段有值时,字段值赋给C,否则取B的字段值。最初尝试使用反射实现,但遇到复杂逻辑问题,尤其是处理泛型。最终通过序列化为Json并使用JToken解决了问题,简化了实现。代码中引用了Newtonsoft.Json.Linq库,作者欢迎改进建议。
最低0.47元/天 解锁文章
1128

被折叠的 条评论
为什么被折叠?



