Esempio n. 1
0
        /// <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()));
        }