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 );
快適なリフレクション比較を離れてエクスプレッションランドに入る必要があることに気づきましたが、ここでの主なタスクは、複合型プロパティを介してプロパティアクセサーとプロパティアクセサーの両方を表現できるようにすることであり、そこで迷子になります。
どんなポインタでもいいでしょう、ありがとう!