Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 如何将对象从反射转换为常规集合?_Nhibernate_Reflection_Fluent Nhibernate_Comparison_Poco - Fatal编程技术网

Nhibernate 如何将对象从反射转换为常规集合?

Nhibernate 如何将对象从反射转换为常规集合?,nhibernate,reflection,fluent-nhibernate,comparison,poco,Nhibernate,Reflection,Fluent Nhibernate,Comparison,Poco,我正在尝试编写一个比较方法,使用反射来比较某些POCO中的属性,以确保它们已正确地持久化到数据库中。例如,假设我有一个POCO: public class NoahsArk { public string Owner { get; set; } public ICollection<Animal> Animals { get; set; } } 公共级诺亚方舟 { 公共字符串所有者{get;set;} 公共ICollection,但它在NHibernate的深处给了

我正在尝试编写一个比较方法,使用反射来比较某些POCO中的属性,以确保它们已正确地持久化到数据库中。例如,假设我有一个POCO:

public class NoahsArk
{
    public string Owner { get; set; }
    public ICollection<Animal> Animals { get; set; }
}
公共级诺亚方舟
{
公共字符串所有者{get;set;}

公共ICollection,但它在NHibernate的深处给了我一个空引用异常。它无法正确处理NHibernate如何为延迟加载代理
ICollection
。更糟糕的是,NHibernate修改POCO以支持延迟加载,但这一切都是在运行时完成的。在源代码中,看起来您是j必须使用常规的
ICollection
,但NHibernate在运行时将其更改为
NHibernate.Collections.Generic.PersistentSet
,这就是导致比较器失败的原因。

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

public static bool EqualsProperties(this object x, object y)
然后继续使用相同的参数T将x和y的属性强制转换为ICollection
;但是,这些集合中的对象显然可能具有不同于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
}
xValue=property.GetValue(x,null);
yValue=property.GetValue(y,null);
if(typeof(IEnumerable).IsInstanceOf(x))
{
IEnumerable xEnumerable=(x作为IEnumerable.Cast();
IEnumerable yEnumerable=(y为IEnumerable).Cast();
//现在可以使用您喜欢的任何LINQ方法
}

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

使用属性来装饰应包含在Equals方法中的属性。请参阅源代码
DomainSignatureAttribute
类和
EntityWithTypedId.Equals
方法。

谢谢你的回答。我在声明中使用类型参数T的想法是,这作为隐式的第一个签入,你必须传递两个相同类型的对象,否则编译器会说它不能隐式地传递将其中一个转换为T型。
public static bool EqualsProperties(this object x, object y)
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
}