private Expression <Func <T, int> > CreateGetHashCode()
        {
            var obj = Expression.Parameter(Type);

            var body   = EqualityComparerHelper.CreateGetHashCodeBody(obj, MembersOrder);
            var lambda = Expression.Lambda <Func <T, int> >(body, obj);

            return(lambda);
        }
        private Expression <Func <IData, int> > CreateGetHashCodeMethod()
        {
            var obj      = Expression.Parameter(typeof(IData));
            var objValue = Expression.Variable(Type);

            var dataType = typeof(Data <>).MakeGenericType(Type);

            var body = Expression.Block(typeof(int), new ParameterExpression[] { objValue },
                                        Expression.Assign(objValue, Expression.Convert(obj, dataType).Value()),
                                        EqualityComparerHelper.CreateGetHashCodeBody(objValue, MembersOrder)
                                        );
            var lambda = Expression.Lambda <Func <IData, int> >(body, obj);

            return(lambda);
        }