我想比较两个相同类型的LINQ实体,并返回两者之间的列表差异。我有代码比较属性并返回差异。
(来自:https://stackoverflow.com/a/5812100/2343826)
public static void WriteChanges<T>(T obj1, T obj2, string objName, int objId, int userId)
{
PropertyInfo[] properties = typeof(T).GetProperties();
StringBuilder sb = new StringBuilder();
foreach (PropertyInfo pi in properties)
{
object value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null);
object value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null);
if (value1 != value2 && (value1 == null || !value1.Equals(value2)))
{
sb.Append(string.Format("Property {0} changed from {1} to {2}" + Environment.NewLine, pi.Name, value1, value2));
}
}
Write(objName, objId, sb.ToString(), userId);
}
属性oItem从NS.oItem更改为NS.oItem
属性dvPC已从pcName1更改为pcName2
是否可以修改此代码以确定该属性是否也是LINQ实体,如果是,则以递归方式检查子实体是否存在差异?
例如,在上面的示例结果中,NS.oItem是与obj1关联的子实体。我希望该方法迭代子对象以比较obj1和obj2之间的差异
感谢您的帮助
答案 0 :(得分:0)
你可以这样做,但混合模板和反射会使它变得不必要地复杂 - 我将其重新编写为非模板函数,它可以只取两个类型为object的变量并且如果它们是不是同一类型。我不确定为什么你需要检查一个属性“是”一个LINQ实体(它真的没有意义 - 你的意思是,映射到一个实体框架实体?但是你需要阻止无限递归吗?类型A的对象具有类型B的属性,该属性也具有类型A的属性。(对于捕获外键关系,这对于EF实体来说并不罕见 - 并且对于具有ForeignKey注释的任何属性不会递归可能是什么你想要的。)