Пример #1
0
        public ResourceConfigurationBuilder <TResource> IgnoreProperty(Expression <Func <TResource, object> > propertyAccessor)
        {
            var pi = ExpressionUtils.GetPropertyInfoFromExpression(propertyAccessor);

            RemoveProperty(pi);
            return(this);
        }
Пример #2
0
        public ResourceConfigurationBuilder <TResource> WithSimpleProperty(Expression <Func <TResource, object> > propertyAccessor)
        {
            var propertyInfo = ExpressionUtils.GetPropertyInfoFromExpression(propertyAccessor);

            AddProperty(propertyInfo, typeof(TResource));
            return(this);
        }
Пример #3
0
        public virtual string GetLinkNameFromExpression <TResource, TLinkedResource>(Expression <Func <TResource, TLinkedResource> > propertyExpression)
        {
            var pi   = ExpressionUtils.GetPropertyInfoFromExpression(propertyExpression);
            var name = CamelCaseUtil.ToCamelCase(pi.Name);

            return(name);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
 public ResourceConfigurationBuilder <TResource> WithIdSelector(Expression <Func <TResource, object> > expression)
 {
     ConstructedMetadata.IdGetter = ExpressionUtils.CompileToObjectTypedFunction(expression);
     ConstructedMetadata.IdSetter = CreateIdSetter(ExpressionUtils.GetPropertyInfoFromExpression(expression));
     return(this);
 }