public Action <string, TItem> Generate() { var expressions = new List <Expression>(); Expression ownerExpression = _itemParam; while (_propertyInfos.Count > 1) { var property = _propertyInfos.Pop(); var propertyExpression = Expression.Property(ownerExpression, property); var ifNullCreate = Expression.IfThen(Expression.Equal(propertyExpression, Expression.Constant(null, property.PropertyType)), Expression.Assign(propertyExpression, Expression.New(property.PropertyType))); expressions.Add(ifNullCreate); ownerExpression = propertyExpression; } var actualProperty = _propertyInfos.Pop(); var actualPropertyExpression = Expression.Property(ownerExpression, actualProperty); var assignExpression = Expression.Assign(actualPropertyExpression, ConverterExpression.Create(actualProperty.PropertyType, _stringParam)); expressions.Add(assignExpression); var block = Expression.Block(expressions); return(Expression.Lambda <Action <string, TItem> >(block, _stringParam, _itemParam).Compile()); }
public Action <string, TItem> Generate() { return(Compile(Expression.Invoke(_assignmentLambda, _itemParam, ConverterExpression.Create(_assignmentLambda.Parameters[1].Type, _stringParam)))); }