private Expression BuildValueMapper(ExpressionGenerator generator, Expression expression) { var valueType = expression.Type; if (!TryMapType(valueType, out var replacementType)) { return(expression); } if (!replacementType.IsEnumEx()) { throw new LinqToDBException("Only enums converted automatically."); } var nameExpr = Expression.Call(_getNameMethodInfo, Expression.Constant(valueType), Expression.Convert(expression, typeof(object))); var nameVar = generator.DeclareVariable(typeof(string), "enumName"); generator.Assign(nameVar, nameExpr); generator.IfThen(MapExpression((string s) => s.IsNullOrEmpty(), nameVar), Throw(() => new LinqToDBException("Can not convert Enum value."))); var result = generator.MapExpression((string n) => Enum.Parse(replacementType, n), nameVar); return(result); }
public Expression <Action <TBase> > BuildSetterExpression <TBase>(TV value) { var setterExpression = _mapper.MapSetterValue(_memberExpression, value); var generator = new ExpressionGenerator(_mapper); var convertedType = setterExpression.Parameters[0].Type; var newParameter = Expression.Parameter(typeof(TBase), setterExpression.Parameters[0].Name); var requiredVariable = generator.DeclareVariable(convertedType, "v"); var replacedBody = setterExpression.GetBody(requiredVariable).Unwrap(); generator.Assign(requiredVariable, newParameter); generator.AddExpression(replacedBody); var block = generator.Build(); var resultExpression = Expression.Lambda <Action <TBase> >(block, newParameter); return(resultExpression); }
public Expression <Action <TBase, TV> > BuildSetterExpression <TBase>() { var generator = new ExpressionGenerator(_mapper); var propLambda = _mapper.MapLambdaInternal(_memberExpression); var convertedType = propLambda.Parameters[0].Type; var newParameter = Expression.Parameter(typeof(TBase), propLambda.Parameters[0].Name); var valueParameter = Expression.Parameter(typeof(TV), "value"); var requiredVariable = generator.DeclareVariable(convertedType, "v"); generator.Assign(requiredVariable, newParameter); var left = propLambda.GetBody(requiredVariable).Unwrap(); var right = _mapper.BuildValueMapper(generator, valueParameter); generator.Assign(left, right); var generated = generator.Build(); var resultLambda = Expression.Lambda <Action <TBase, TV> >(generated, newParameter, valueParameter); return(resultLambda); }