我有两节课:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public bool isActif { get; set; }
public Product[] Product { get; set; }
}
public class Product
{
public string Id { get; set; }
}
还有两个实例:
Customer Customer1 = new Customer
{
FirstName = "FirstName1",
LastName = "LastName1",
isActif = true,
Product = new Product[]
{
new Product()
{
Id = "1"
}
}
};
Customer Customer2 = new Customer
{
FirstName = "FirstName2",
LastName = "LastName2",
isActif = false,
Product = new Product[]
{
new Product()
{
Id = "2"
}
}
};
我有一种方法可以比较两个实例的所有属性:
但是,当我到达属性
Product
时,就会生成一个StackOverflowException
。为什么呢以及如何循环属性(如果是数组)?编辑:当我使用列表时,不是
StackOverflowException
,而是System.Reflection.TargetParameterCountException
。如果是数组,如何循环属性 最佳答案
在:
foreach (PropertyInfo propertyInfo in
objectType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.CanRead))
更改以下条件:
.Where(x => x.CanRead && x.Name != "SyncRoot")
SyncRoot documentation
如果您这样做:
Console.WriteLine(Customer1.Product.Equals(Customer1.Product.SyncRoot));
您将看到Customer1.Product等于其SyncRoot属性。
因此,当您在产品属性上使用AreEquals方法时,您将到达SyncRoot属性,该属性与产品属性相同。
这样一来,您将永远无法离开循环。 (因为SyncRoot具有指向其自身的SyncRoot属性)