需求是,同一类型的两个对象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