gpt4 book ai didi

nhibernate - 如何将对象从反射转换为通用集合?

转载 作者:行者123 更新时间:2023-12-04 00:44:48 24 4
gpt4 key购买 nike

我正在尝试编写一个比较方法来使用反射比较某些 POCO 中的属性,以确保它们已正确保存到数据库中。例如,假设我有这个 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。到目前为止,我的比较方法如下所示:
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()是我写的一个扩展方法,用来判断一个类型是否实现了一个接口(interface)。如您所见,该方法是不完整的。我遇到的问题是当我使用 property.GetValue(x, null) ,它返回一个 object ,我不知道如何将其转换为特定的通用 ICollection类型。我需要能够做到这一点,这样我才能使用 LINQ 来执行 x.Contains(y)比较两个集合是否相等。关于如何做到这一点的任何想法?

附言我尝试使用 Compare .NET Objects ,但它在 NHibernate 深处的某个地方给了我一个空引用异常。它不能正确处理 NHibernate 如何代理 ICollection用于延迟加载。更糟糕的是,NHibernate 修改了 POCO 以支持延迟加载,但这都是在运行时完成的。在源代码中,您似乎只是在使用常规 ICollection , 但 NHibernate 将其更改为 NHibernate.Collections.Generic.PersistentSet在运行时,这就是导致比较器失败的原因。

最佳答案

您的问题有点令人困惑,因为您在 EqualsProperties 方法的声明中不需要类型参数 T 。您只需

public static bool EqualsProperties(this object x, object y)

然后继续使用相同的参数 T 将 x 和 y 的属性转换为 ICollection<T> ;但是,这些集合中的对象显然可能具有与 x 和 y 不同的类型。

现在回答您的问题:您无需转换为正确的泛型类型即可使用 LINQ Contains 方法。你可以这样做:
xValue = property.GetValue(x, null);
yValue = property.GetValue(y, null);
if (typeof(IEnumerable).IsInstanceOf(x))
{
IEnumerable<object> xEnumerable = (x as IEnumerable).Cast<object>();
IEnumerable<object> yEnumerable = (y as IEnumerable).Cast<object>();
// use any LINQ method you like now
}

您还应该确保使用采用相等比较器的 LINQ 重载,因为您的域对象显然不会覆盖 Equals 方法本身。否则,您将不会编写此单元测试代码来比较它们。

关于nhibernate - 如何将对象从反射转换为通用集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1711903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com