public Documentation GetDocs(MethodInfo info)
        {
            var result = new Documentation {
                Endpoint = Path
            };

            {
                if (info.GetCustomAttribute <Documentation.DescriptionAttribute>() is Documentation.DescriptionAttribute attrib)
                {
                    result.Description = attrib.Value;
                }
            }

            {
                var fields = RequestType.GetProperties().Where(prop => prop.CanWrite).ToArray();
                result.Request = new Documentation.JsonDoc[fields.Length];

                for (int i = 0; i < fields.Length; i++)
                {
                    result.Request[i] = GetDocs(fields[i]);
                }
            }

            {
                var fields = ResponseType.GetProperties().Where(prop => prop.CanWrite).ToArray();
                result.Response = new Documentation.JsonDoc[fields.Length];

                for (int i = 0; i < fields.Length; i++)
                {
                    result.Response[i] = GetDocs(fields[i]);
                }
            }

            return(result);
        }
Example #2
0
        public Expression <Func <T, TResponse> > Select <TResponse>(string include = null)
        {
            List <MemberBinding> bindings = new List <MemberBinding>();

            foreach (var p in ResponseType.GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.CanWrite))
            {
                NavigationPropertyAttribute navAttr = p.GetCustomAttribute <NavigationPropertyAttribute>();
                if (navAttr != null)
                {
                    bindings.Add(Expression.Bind(p, Expression.Property(Expression.Property(Parameter, navAttr.NavigationProperty), navAttr.Property)));
                }
                else if (IncludeTree.IsMappeable(p))
                {
                    bindings.Add(Expression.Bind(p, Expression.Property(Parameter, p.Name)));
                }
            }

            if (!string.IsNullOrWhiteSpace(include))
            {
                var incTrees = IncludeTree.Build(include, ResponseType, ModelType, Parameter);
                foreach (var item in incTrees)
                {
                    bindings.Add(Expression.Bind(item.ResponseProperty, item.CreateInitExpression()));
                }
            }

            MemberInitExpression initExpression = Expression.MemberInit(Expression.New(typeof(TResponse)), bindings);

            Expression current = Parameter;

            while (current != null && !(current is ParameterExpression))
            {
                current = ((MemberExpression)current).Expression;
            }

            return(Expression.Lambda <Func <T, TResponse> >(initExpression, (ParameterExpression)current));
        }