Reflectionを使用して一部のPOCOのプロパティを比較し、データベースに正しく永続化されていることを確認するCompareメソッドを作成しようとしています。たとえば、私がこのPOCOを持っているとしましょう:
public class NoahsArk
{
public string Owner { get; set; }
public ICollection<Animal> Animals { get; set; }
}
私がしたいのはこれです:
[Test]
public class Saves_Correctly_To_Database()
{
var noahsArk = new NoahsArk { // some setup code here };
db.Save(noahsArk);
var dbNoahsArk = db.Get<NoahsArk>(noahsArk.Id);
Assert.That(Compare(noahsArk, dbNoahsArk), Is.True);
}
私が使用しているORMはNHibernateです。私のCompareメソッドは、これまでのところ次のようになっています。
public static bool EqualsProperties<T>(this T x, T y)
{
var xType = x.GetType();
foreach (var property in xType.GetProperties())
{
if (property.GetValue(x, null).Implements(typeof(ICollection<>)))
{
var xValue = property.GetValue(x, null) as ICollection<T>;
var yValue = property.GetValue(y, null) as ICollection<T>;
}
Object.Implements()
型がインターフェースを実装するかどうかを決定するために私が書いた拡張メソッドです。ご覧のとおり、メソッドは不完全です。私が遭遇している問題は、を使用するproperty.GetValue(x, null)
と、が返され、特定の汎用タイプobject
にキャストする方法がわからないことです。LINQを使用して2つのコレクションが等しいICollection
かどうかを比較できるように、これを実行できる必要があります。x.Contains(y)
これを行う方法について何かアイデアはありますか?
PS Compare .NET Objectsを使用しようとしましたが、NHibernateの奥深くでnull参照例外が発生します。ICollection
NHibernateが遅延読み込みのためにプロキシする方法を適切に処理しません。さらに悪いことに、NHibernateは遅延読み込みをサポートするようにPOCOを変更しますが、これはすべて実行時に行われます。ソースコードでは、通常のを使用しているように見えますがICollection
、NHibernateはこれをNHibernate.Collections.Generic.PersistentSet
実行時に変更します。これが、比較機能の失敗の原因です。