2016-05-22 3 views
1

Ich habe zwei Klasse:Reflexion und Rekursion in Array - Stackoverflow

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; } 
} 

Und zwei Instanzen:

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" 
     } 
    } 
}; 

Ich habe eine Methode, die alle Eigenschaften der beiden Instanzen vergleichen:

Aber wenn ich auf die Eigenschaft komme, habe ich eine StackOverflowException generiert. Warum ? Und wie man die Eigenschaft wiederholt, wenn es ein Array ist?

EDIT: Wenn ich die Liste verwenden, gibt es nicht StackOverflowException aber System.Reflection.TargetParameterCountException. Wie die Eigenschaft auf Schleife, wenn es ein Array

+0

Haben Sie in den Code debugged, um herauszufinden, warum Sie einen Stack-Overflow bekommen? –

+0

Das sieht wie ein Duplikat aus. http://stackoverflow.com/questions/3747572/how-doi-i-deal-with-arrays-using-reflection –

+0

Diese vorgeschlagene Antwort kann helfen: http://stackoverflow.com/a/4879978/6256551 –

Antwort

1

in:

foreach (PropertyInfo propertyInfo in 
      objectType.GetProperties(BindingFlags.Public | BindingFlags.Instance) 
      .Where(x => x.CanRead)) 

Ihre ändern, in dem Zustand für:

.Where(x => x.CanRead && x.Name != "SyncRoot") 

SyncRoot documentation

Wenn Sie das tun:

Console.WriteLine(Customer1.Product.Equals(Customer1.Product.SyncRoot)); 

Sie werden sehen, dass Customer1.Product gleich der SyncRoot-Eigenschaft ist. Wenn Sie die AreEquals-Methode für die Produkteigenschaft verwenden, erreichen Sie daher die SyncRoot-Eigenschaft, die der Produkteigenschaft entspricht. Dann werden Sie nie in der Lage sein, die Schleife zu verlassen. (Da SyncRoot eine SyncRoot-Eigenschaft auf sich selbst zeigt)