public override bool Equals(object obj) { if (obj == this) { return(true); } if (obj is AttributeSource) { AttributeSource other = (AttributeSource)obj; if (HasAttributes) { if (!other.HasAttributes) { return(false); } if (this.attributeImpls.Count != other.attributeImpls.Count) { return(false); } // it is only equal if all attribute impls are the same in the same order State thisState = this.GetCurrentState(); State otherState = other.GetCurrentState(); while (thisState != null && otherState != null) { if (otherState.attribute.GetType() != thisState.attribute.GetType() || !otherState.attribute.Equals(thisState.attribute)) { return(false); } thisState = thisState.next; otherState = otherState.next; } return(true); } else { return(!other.HasAttributes); } } else { return(false); } }