0
我有以下方法来比较DTO。使用表达式比较属性和子属性上的对象
bool Equals<T1, T2>(T1 t1, T2 t2, params Expression<Func<T1, object>>[] accessors)
{
return !(
from accessor in accessors
select ((MemberExpression) accessor.Body).Member.Name into propertyName
let p1 = typeof (T1).GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
let p2 = typeof (T2).GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
let p1val = p1.GetValue(t1, null)
let p2val = p2.GetValue(t2, null)
where !Equals(p1val, p2val)
select p1val
).Any();
}
我可以使用调用这个(a
和b
是对象的情况下,按照惯例共享相同的属性,但不是相同的对象):
Equals(a, b, x => x.PropertyOne, x => x.PropertyTwo);
哪些对象进行比较财产财产,这在大多数情况下都很好。
但是,我发现一个案例,我需要比较具有复杂类型属性的对象,以及我想要在复杂类型而不是对象上比较属性的对象。事情是这样的:
Equals(a, b, x => x.ComplexTypeProperty.ChildProp);
我已经意识到我需要离开舒适的反映比较和输入表达式的土地,但这里的主要任务是能够表达两个属性访问和属性访问通过复杂的类型属性,这就是我迷失的地方。
任何指针都会很好,谢谢!