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); }
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); }
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); } }
public static IApiItemBuilder <TItem> Configure <TItem>(this IApiItemBuilder <TItem> builder, Action <IApiItemBuilder <TItem> > configureAction) { configureAction(builder); return(builder); }
public static IApiItemBuilder <TItem> AutoConfigure <TItem>(this IApiItemBuilder <TItem> builder) { return(builder.AutoConfigure(null)); }
public void AddItem <TItem>(IApiItemBuilder <TItem> builder) { AddNestedItem(builder, 0); }