我有以下方法来比较 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 );
我意识到我需要离开舒适的反射比较并进入表达式领域,但这里的主要任务是能够通过复杂类型的属性来表达属性访问器和属性访问器,这就是我迷路的地方。
任何指针都会很好,谢谢!