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); }
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)); }