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); }