/// <summary> /// Generate an automatic hash code for an object based on members of that object. /// </summary> /// <param name="obj">The object to search.</param> /// <param name="selector">Choose what object members to use in hash code generation</param> /// <returns>A hash code</returns> public static int GetAutoHashCode(this object obj, MemberSelector selector = MemberSelector.PublicProperties) { var type = obj.GetType(); List <object> hashCodes = new List <object>(); if (selector.HasFlag(MemberSelector.PublicProperties)) { hashCodes.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(p => p.GetValue(obj))); } if (selector.HasFlag(MemberSelector.PrivateProperties)) { hashCodes.AddRange(type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).Select(p => p.GetValue(obj))); } if (selector.HasFlag(MemberSelector.PublicFields)) { hashCodes.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance).Select(p => p.GetValue(obj))); } if (selector.HasFlag(MemberSelector.PrivateFields)) { hashCodes.AddRange(type.GetFields(BindingFlags.Public | BindingFlags.Instance).Select(p => p.GetValue(obj))); } return(GetAutoHashCode(null, hashCodes.ToArray())); }