public ExpressionValue(Type sourceType, ValueInfo valueInfo, IMemberVisitor memberVisitor) { SourceType = sourceType; ValueInfo = valueInfo; MemberVisitor = memberVisitor; this.LambdaProvider = CreateValueLambda(sourceType, valueInfo, memberVisitor); }
public void ShouldGetExpectedExpressionFromNullableMemberPaths(string path, string expectedExpression) { var valueInfo = ValueInfo.Parse(path); var memberVisitor = IMemberVisitor.GetObjectVisitor(typeof(SourceNullableClass)); IValueLambdaProvider constLambda = new PathValueLambdaProvider(typeof(SourceNullableClass), valueInfo.NavigatePaths, memberVisitor); var lambda = constLambda.GetLambda(); lambda.ToString().Should().Be(expectedExpression); }
//public IMemberVisitor GetMemberVisitor() { return this; } public void AcceptMemberVisitor(IMemberVisitor visitor, DB_Type type, DB_Member member) { IMemberVisitor memberVisitor = visitor; if (memberVisitor != null) { if (member.member_type == (int)MemberTypes.Method) { EnterMethod(member); memberVisitor.VisitMember(type, member); LeaveMethod(); } else { memberVisitor.VisitMember(type, member); } } }
private (Type ReturnType, Expression Body) CreateLambdaBody(ParameterExpression p, List <ValuePath> pathInfos, IMemberVisitor memberProvider) { IMemberVisitor currentMemberProvider = memberProvider; Type currentExpressionType = currentMemberProvider.CurrentType; Expression currentExpression = p; foreach (var pathInfo in pathInfos.TrimNotNull()) { if (pathInfo.IsFunction) { var functionResult = IFilterFunction.ExecuteFunction(pathInfo.Name, pathInfo.FunctionArgs, new ExecuteContext { CurrentExpression = currentExpression, MemberVisitor = currentMemberProvider, CurrentType = currentExpressionType, }); currentExpressionType = functionResult.LambdaValueType; currentExpression = currentExpression.Connect(functionResult.LambdaExpression); currentMemberProvider = functionResult.MemberProvider; } else { var memberInfo = currentMemberProvider.GetSubMemberInfo(pathInfo.Name); if (memberInfo == null) { throw ExpressionErrors.MemberNotFound(pathInfo.Name); } else { currentExpressionType = memberInfo.ExpressionValueType; currentExpression = currentExpression.Connect(memberInfo.SelectExpression); currentMemberProvider = memberInfo.SubProvider; } } } return(currentExpressionType, currentExpression); }
public PathValueLambdaProvider(Type sourceType, List <ValuePath> paths, IMemberVisitor memberVisitor) { this.SourceType = sourceType; this.paths = paths; this.memberVisitor = memberVisitor ?? throw new ArgumentNullException(nameof(memberVisitor)); }