我有两节课:

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属性)

08-04 14:56