Esempio n. 1
0
        public ReflectedMember(MemberInfo member, SolrFieldAttribute solrAttr)
        {
            if (member == null)
            {
                throw new ArgumentNullException("member");
            }
            if (member is PropertyInfo || member is FieldInfo)
            {
                MemberName = member.Name;
                Type       = GetMemberType(member);
                Get        = GetGetter(member);
                Set        = GetSetter(member);
            }
            else
            {
                throw new ArgumentException("Invalid member type, only Properties and Fields are supported", "member");
            }
            if (solrAttr == null)
            {
                throw new ArgumentNullException("solrAttr");
            }

            SolrField      = solrAttr.Field ?? MemberName;
            SolrFieldBoost = solrAttr.Boost;
            ReadOnly       = solrAttr.ReadOnly;
        }
        void IExpressionBuilder <TDocument> .GetInfosFromExpression(Expression <Func <TDocument, object> > expression, out PropertyInfo propertyInfo, out SolrFieldAttribute solrFieldAttribute)
        {
            if (this._expressionCache.Get(expression, out propertyInfo, out solrFieldAttribute))
            {
                return;
            }

            var lambda = (LambdaExpression)expression;

            MemberExpression memberExpression;

            switch (lambda.Body.NodeType)
            {
            case ExpressionType.Convert:
                var unaryExpression = (UnaryExpression)lambda.Body;

                memberExpression = (MemberExpression)unaryExpression.Operand;

                propertyInfo = memberExpression.Member as PropertyInfo;

                Checker.IsNull(propertyInfo, Resource.ExpressionMustBePropertyException);

                break;

            case ExpressionType.MemberAccess:
                memberExpression = (MemberExpression)lambda.Body;

                propertyInfo = memberExpression.Member as PropertyInfo;

                Checker.IsNull(propertyInfo, Resource.ExpressionMustBePropertyException);

                break;
            }

            if (propertyInfo != null)
            {
                var attrs = propertyInfo.GetCustomAttributes(true);
                solrFieldAttribute = (SolrFieldAttribute)attrs.FirstOrDefault(q => q is SolrFieldAttribute);

                this._expressionCache.Set(expression, propertyInfo, solrFieldAttribute);
            }
            else
            {
                throw new InvalidOperationException(Resource.UnknownToResolveExpressionException);
            }
        }
        void IExpressionCache <TDocument> .Set(Expression <Func <TDocument, object> > expression, PropertyInfo propertyInfo, SolrFieldAttribute solrFieldAttribute)
        {
            var key   = GetKeyFromExpression(expression);
            var cache = new Tuple <PropertyInfo, SolrFieldAttribute>(propertyInfo, solrFieldAttribute);

            if (this._internalCache.ContainsKey(key))
            {
                this._internalCache[key] = cache;
            }
            else
            {
                this._internalCache.Add(key, cache);
            }
        }
        bool IExpressionCache <TDocument> .Get(Expression <Func <TDocument, object> > expression, out PropertyInfo propertyInfo, out SolrFieldAttribute solrFieldAttribute)
        {
            var key = GetKeyFromExpression(expression);

            if (this._internalCache.ContainsKey(key))
            {
                var cache = this._internalCache[key];

                propertyInfo       = cache.Item1;
                solrFieldAttribute = cache.Item2;
                return(true);
            }

            propertyInfo       = null;
            solrFieldAttribute = null;
            return(false);
        }