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));
 }
Example #3
0
 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;
			}
Example #6
0
            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
                                        ));
            }