I find my self overriding Equals() and GetHashCode() frequently to implement the semantic that business objects with identical property values are
Equals()
GetHashCode()
Perhaps I'm confused here, but shouldn't the on null check return a 1 instead of a 0 in the GetHashCode override?
null
GetHashCode
So
MyStringProp == null ? 0 : MyStringProp.GetHashValue()
should be
MyStringProp == null ? 1 : MyStringProp.GetHashValue()