private static Property GetProperty <TOut>(Expression <Func <T, TOut> > expression)
        {
            var memberExpression = expression.Body as MemberExpression;

            if (memberExpression == null)
            {
                throw new Exception("Could not determine member from " + expression);
            }

            var setter = GenerateSetterMethod <TOut>(memberExpression);

            return(TypedProperty <T, TOut> .Create(memberExpression.Member.Name, memberExpression.Type, expression.Compile(), setter));
        }