public ResourceConfigurationBuilder <TResource> IgnoreProperty(Expression <Func <TResource, object> > propertyAccessor) { var pi = ExpressionUtils.GetPropertyInfoFromExpression(propertyAccessor); RemoveProperty(pi); return(this); }
public ResourceConfigurationBuilder <TResource> WithSimpleProperty(Expression <Func <TResource, object> > propertyAccessor) { var propertyInfo = ExpressionUtils.GetPropertyInfoFromExpression(propertyAccessor); AddProperty(propertyInfo, typeof(TResource)); return(this); }
public virtual string GetLinkNameFromExpression <TResource, TLinkedResource>(Expression <Func <TResource, TLinkedResource> > propertyExpression) { var pi = ExpressionUtils.GetPropertyInfoFromExpression(propertyExpression); var name = CamelCaseUtil.ToCamelCase(pi.Name); return(name); }
public Expression <Func <TMain, object> > GetIdExpression <TMain, TLinkedResource>(Expression <Func <TMain, TLinkedResource> > linkedResourceExpression) { var resourcePi = ExpressionUtils.GetPropertyInfoFromExpression(linkedResourceExpression); var idPropertyName = GetIdPropertyNameFromPropertyName(resourcePi.Name); var idPi = typeof(TMain).GetProperty(idPropertyName); if (idPi == null) { return(null); } var parameterExp = Expression.Parameter(typeof(TMain)); var propertyExp = Expression.Property(parameterExp, idPi); var castedExp = Expression.Convert(propertyExp, typeof(object)); var lambda = Expression.Lambda <Func <TMain, object> >(castedExp, parameterExp); return(lambda); }
/// <summary> /// /// </summary> /// <remarks> /// Conventions used: /// IResourceTypeConvention /// ILinkIdConvention /// ILinkNameConvention /// /// Supply a custom implementations to alter behavior. /// </remarks> public ResourceConfigurationBuilder <TResource> WithLinkedResource <TNested>(Expression <Func <TResource, TNested> > objectAccessor, Expression <Func <TResource, object> > idAccessor = null, string linkedResourceType = null, string linkName = null, ResourceInclusionRules inclusionRule = ResourceInclusionRules.Smart) where TNested : class { if (typeof(TNested).Name == "Array") { throw new NotSupportedException("Array type is not supported!"); } var propertyInfo = ExpressionUtils.GetPropertyInfoFromExpression(objectAccessor); var isCollection = typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType); var linkedType = isCollection ? GetItemType(typeof(TNested)) : typeof(TNested); if (linkName == null) { linkName = LinkNameConvention.GetLinkNameFromExpression(objectAccessor); } if (linkedResourceType == null) { linkedResourceType = ResourceTypeConvention.GetResourceTypeFromRepresentationType(linkedType); } if (idAccessor == null) { idAccessor = LinkIdConvention.GetIdExpression(objectAccessor); } var link = new LinkMapping <TResource, TNested> { RelationshipName = linkName, ResourceIdGetter = idAccessor, ResourceGetter = ExpressionUtils.CompileToObjectTypedExpression(objectAccessor), IsCollection = isCollection, RelatedCollectionProperty = isCollection ? propertyInfo : null, RelatedBaseType = linkedType, RelatedBaseResourceType = linkedResourceType, InclusionRule = inclusionRule }; ConstructedMetadata.Relationships.Add(link); return(this); }
public ResourceConfigurationBuilder <TResource> WithIdSelector(Expression <Func <TResource, object> > expression) { ConstructedMetadata.IdGetter = ExpressionUtils.CompileToObjectTypedFunction(expression); ConstructedMetadata.IdSetter = CreateIdSetter(ExpressionUtils.GetPropertyInfoFromExpression(expression)); return(this); }