using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
Console.WriteLine("Processing using Array...");
ProcessRecursiveArray(a);
Console.WriteLine("Processing using List...");
Console.WriteLine("Created circular reference.");
Console.WriteLine("Processing using Array...");
ProcessRecursiveArray(a);
Console.WriteLine("Processing using List...");
public string Name {get;set;}
public Dolor Dolor {get;set;}
public Sit Sit {get;set;}
public string Name {get;set;}
public string Name {get;set;}
public Amet Amet {get;set;}
public string Name {get;set;}
public Dolor Dolor {get;set;}
public Lorem Lorem {get;set;}
public static void ProcessRecursiveArray(object entity, string[] traversedEntities = null)
string entityTypeName = entity.GetType().Name;
if (traversedEntities == null)
traversedEntities = new [] {entityTypeName};
else if (traversedEntities.Contains(entityTypeName))
Console.WriteLine("We've already checked " + entityTypeName + " so we're skipping this check.");
var newTraversedEntities = new string[traversedEntities.Length + 1];
Array.Copy(traversedEntities, newTraversedEntities, traversedEntities.Length);
traversedEntities = newTraversedEntities;
traversedEntities[traversedEntities.Length - 1] = entityTypeName;
Console.WriteLine("Checking path " + string.Join(" -> ", traversedEntities));
PropertyInfo[] properties = entity.GetType().GetProperties();
foreach (PropertyInfo property in properties)
if (property.PropertyType == typeof(string))
Console.WriteLine(string.Join(".", traversedEntities) + "." + property.Name + " = \"" + property.GetValue(entity) + "\"");
else if (property.PropertyType.IsClass)
object value = property.GetValue(entity);
ProcessRecursiveArray(value, traversedEntities);
public static void ProcessRecursiveList(object entity, List<string> traversedEntities = null)
string entityTypeName = entity.GetType().Name;
if (traversedEntities == null)
traversedEntities = new List<string>();
else if (traversedEntities.Contains(entityTypeName))
Console.WriteLine("We've already checked " + entityTypeName + " so we're skipping this check.");
traversedEntities.Add(entityTypeName);
Console.WriteLine("Checking path " + string.Join(" -> ", traversedEntities));
PropertyInfo[] properties = entity.GetType().GetProperties();
foreach (PropertyInfo property in properties)
if (property.PropertyType == typeof(string))
Console.WriteLine(string.Join(".", traversedEntities) + "." + property.Name + " = \"" + property.GetValue(entity) + "\"");
else if (property.PropertyType.IsClass)
object value = property.GetValue(entity);
ProcessRecursiveList(value, traversedEntities);