class HashcodeGenerator
{
public int GetHashCodeForArbitaryType<TType>(TType complexObject)
{
Type objectType = complexObject.GetType();
PropertyInfo[] properties = objectType.GetProperties().OrderByDescending(x => x.Name).ToArray();
object firstValue = properties[0].GetValue(complexObject);
int hashCode = firstValue?.GetHashCode() ?? 0;
for (int propertyIndex=1; propertyIndex < properties.Length; propertyIndex++)
{
object value = properties[propertyIndex].GetValue(complexObject);
unchecked
{
hashCode = (hashCode * 397) ^ (value?.GetHashCode() ?? 0);
}
}
return hashCode;
}
}