Пример #1
0
        private IApiItemBuilder <TItem> AddField <TItem, TField>(IApiItemBuilder <TItem> builder, Expression <Func <TItem, TField> > expression, int nesting)
        {
            IApiFieldBuilder <TItem, TField> fieldBuilder = builder.Field(expression);

            if (_configuration.AllowWrite)
            {
                fieldBuilder.AllowWrite();
            }

            if (nesting >= _configuration.MaxNesting)
            {
                return(builder);
            }

            if (typeof(TField).GetConstructor(new Type[0]) != null)
            {
                Reflect.Instance(this)
                .GetMethod(nameof(AddFieldAsItem))
                .MakeGeneric <TItem, TField>()
                .Invoke(fieldBuilder, nesting);
            }

            Type enumNav = typeof(TField).GetGenericInterface(typeof(ICollection <>))?.GetGenericArguments()[0];

            if (enumNav != null)
            {
                Reflect.Instance(this)
                .GetMethod(nameof(AddFieldAsCollection))
                .MakeGeneric(typeof(TItem), typeof(TField), enumNav)
                .Invoke(fieldBuilder, nesting);
            }

            return(builder);
        }
Пример #2
0
        public static IApiItemBuilder <TItem> AutoConfigure <TItem>(this IApiItemBuilder <TItem> builder, AutoConfiguration configuration)
        {
            if (configuration == null)
            {
                configuration = new AutoConfiguration();
            }

            var configurer = new AutoConfigurer(configuration);

            configurer.AddItem <TItem>(builder);

            return(builder);
        }
Пример #3
0
        private void AddNestedItem <TItem>(IApiItemBuilder <TItem> builder, int nesting)
        {
            Type itemType = typeof(TItem);

            foreach (PropertyInfo property in itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                ParameterExpression paramExpression = Expression.Parameter(itemType);
                LambdaExpression    expression      = Expression.Lambda(Expression.Property(paramExpression, property), paramExpression);

                Reflect.Instance(this)
                .GetMethod(nameof(AddField))
                .MakeGeneric(typeof(TItem), property.PropertyType)
                .Invoke(builder, expression, nesting);
            }
        }
Пример #4
0
 public static IApiItemBuilder <TItem> Configure <TItem>(this IApiItemBuilder <TItem> builder, Action <IApiItemBuilder <TItem> > configureAction)
 {
     configureAction(builder);
     return(builder);
 }
Пример #5
0
 public static IApiItemBuilder <TItem> AutoConfigure <TItem>(this IApiItemBuilder <TItem> builder)
 {
     return(builder.AutoConfigure(null));
 }
Пример #6
0
 public void AddItem <TItem>(IApiItemBuilder <TItem> builder)
 {
     AddNestedItem(builder, 0);
 }