public CircularReferenceTwo HCircCopy(object obj, Dictionary<int, object> track)
        {
            object clone;
            if (track.TryGetValue(RuntimeHelpers.GetHashCode(obj), out clone))
            {
                var c = clone as CircularReferenceTwo;
                if (null != c)
                    return c;
            }

            var myClone = new CircularReferenceTwo();
            track.Add(RuntimeHelpers.GetHashCode(obj), myClone);

            myClone.Identifier = this.Identifier;
            CircularReferenceOne cr = this.CR1;
            myClone.CR1 = null == cr ? null : cr.HCircCopy(cr, track);

            return myClone;
        }
        public CircularReferenceOne HCircCopy(object obj, Dictionary <int, object> track)
        {
            object clone;

            if (track.TryGetValue(RuntimeHelpers.GetHashCode(obj), out clone))
            {
                var c = clone as CircularReferenceOne;
                if (null != c)
                {
                    return(c);
                }
            }

            var myClone = new CircularReferenceOne();

            track.Add(RuntimeHelpers.GetHashCode(obj), myClone);

            myClone.Identifier = this.Identifier;
            CircularReferenceTwo cr = this.CR2;

            myClone.CR2 = null == cr ? null : cr.HCircCopy(cr, track);

            return(myClone);
        }