private static void WalkReferences(ReferenceTest @ref, IList <ReferenceTest> refs) { if (refs.Contains(@ref)) { throw new Exception($"Circular reference ({refs.Last().Id} referenced {@ref.Id} which was element {refs.IndexOf(@ref)} in the stack)"); } refs = refs.Append(@ref).ToList(); WalkReferences(@ref.Ref, refs); }
static void Main(string[] args) { var refA = new ReferenceTest() { Id = 1 }; var refB = new ReferenceTest() { Id = 2, Ref = refA }; var refC = new ReferenceTest() { Id = 3, Ref = refB }; refA.Ref = refC; try { Reference.CheckCircular(refA); } catch (Exception e) { Console.WriteLine($"Caught circular reference exception: {e.Message}"); } var refVal = new ReferenceValidator <ReferenceTest>(r => r.Ref, refA); try { refVal.Validate(); } catch (CircularReferenceException e) { Console.WriteLine($"Caught CircularReferenceException: {e.Message}"); } }
public static void CheckCircular(ReferenceTest initial) { var refs = new List <ReferenceTest>(); WalkReferences(initial, refs); }