public override IModelNode VisitField <T>(IModelFieldOf <T> field) { var subVisitor = new BindingTargetVisitor <T>(field, _transformFactory); _target.Accept(subVisitor); Result = subVisitor.Result; return(base.VisitField(field)); }
public override IModelNode VisitField <T>(IModelFieldOf <T> field) { Result = _transformFactory.CreateTransformation(_source, field); return(base.VisitField(field)); }
protected ModelFieldBinding(IModelField sourceField, IModelField targetField, BindingTransformation transformation) { SourceField = sourceField ?? throw new ArgumentNullException(nameof(sourceField)); TargetField = targetField ?? throw new ArgumentNullException(nameof(targetField)); Transformation = transformation ?? throw new ArgumentNullException(nameof(transformation)); }
public static BindingTransformation Create(BindingTransformation bindingTransformation) { return new RunOnceTransformationImpl(bindingTransformation).Transform; }
public RunOnceTransformationImpl(BindingTransformation bindingTransformation) { _bindingTransformation = bindingTransformation; }
public void WriteCopyValueInstruction(IModelField source, IModelField target, BindingTransformation transformationDelegate) { var sourceField = Expression.Constant(source, typeof(TSourceField)); var readValue = Expression.Variable(source.FieldType.Type, "readValue"); var readMethod = _dataModelReaderType.GetMethod(nameof(IDataModelReader <TSourceModel, TSourceField> .ReadField)) .MakeGenericMethod(source.FieldType.Type); var assignReadValueExpression = Expression.Assign(readValue, Expression.Call(_sourceReader, readMethod, sourceField)); var boxedReadValue = Expression.Variable(typeof(object), "boxedReadValue"); var boxReadValueExpr = Expression.Assign(boxedReadValue, BoxingHelper.BoxIfNeeded(source.FieldType.Type, readValue)); var boxedConvertedValue = Expression.Variable(typeof(object), "boxedConvertedValue"); MethodCallExpression callConvertMethodExpr; if (transformationDelegate.Method.IsStatic) { callConvertMethodExpr = Expression.Call(transformationDelegate.Method, _bindingContext, boxedReadValue, boxedConvertedValue); } else { callConvertMethodExpr = Expression.Call(Expression.Constant(transformationDelegate.Target), transformationDelegate.Method, _bindingContext, boxedReadValue, boxedConvertedValue); } var convertedValue = Expression.Variable(target.FieldType.Type, "convertedValue"); var unboxReadValueExpr = BoxingHelper.UnboxIfNeeded(target.FieldType.Type, boxedConvertedValue); var targetField = Expression.Constant(target, typeof(TTargetField)); var writeMethod = _dataModelWriterType.GetMethod(nameof(IDataModelWriter <TTargetModel, TTargetField> .WriteField)) .MakeGenericMethod(target.FieldType.Type); var writeConvertedValueExpr = Expression.Call(_targetWriter, writeMethod, targetField, unboxReadValueExpr); var writeIfConvertedExpr = Expression.IfThen( callConvertMethodExpr, writeConvertedValueExpr ); _expressionBody.Add(Expression.Block( new[] { readValue, boxedReadValue, boxedConvertedValue, convertedValue }, assignReadValueExpression, boxReadValueExpr, writeIfConvertedExpr )); }