private Expression <Func <T2, T1> > CreateFromMethod() { var value2 = Expression.Parameter(Type2); var value1 = Expression.Variable(Type1); List <Expression> list = new List <Expression>(); if (TransformerHelper.IsEqualsTypes(Type1, Type2)) { list.Add(Expression.Label(Expression.Label(Type2), value2)); } else { list.Add(TransformerHelper.BuildBody(value1, value2, MembersOrder1, MembersOrder2)); list.Add(Expression.Label(Expression.Label(Type1), value1)); } return(Expression.Lambda <Func <T2, T1> >(TransformerHelper.IsEqualsTypes(Type1, Type2) ? list[0] : Expression.Block(typeof(T1), new ParameterExpression[] { value1 }, list), value2)); }
public Transformer(Func <Type, MemberInfo, int> membersOrder1 = null, Func <Type, MemberInfo, int> membersOrder2 = null) { if (!TransformerHelper.CheckCompatible(typeof(T1), typeof(T2), new HashSet <Type>(), membersOrder1, membersOrder2)) { throw new ArgumentException(String.Format("{0} not compatible with {1}", typeof(T1).ToString(), typeof(T2).ToString())); } Type1 = typeof(T1); Type2 = typeof(T2); MembersOrder1 = membersOrder1; MembersOrder2 = membersOrder2; LambdaTo = CreateToMethod(); to = LambdaTo.Compile(); LambdaFrom = CreateFromMethod(); from = LambdaFrom.Compile(); }
private Expression <Func <T, IData> > CreateToMethod() { var value = Expression.Parameter(Type1); var data = Expression.Variable(typeof(Data <>).MakeGenericType(Type2)); List <Expression> list = new List <Expression>(); if (TransformerHelper.IsEqualsTypes(Type1, Type2)) { list.Add(Expression.Label(Expression.Label(typeof(IData)), Expression.New(data.Type.GetConstructor(new Type[] { Type1 }), value))); } else { list.Add(Expression.Assign(data, Expression.New(data.Type.GetConstructor(new Type[] { })))); list.Add(TransformerHelper.BuildBody(data.Value(), value, MembersOrder1, MembersOrder2)); list.Add(Expression.Label(Expression.Label(data.Type), data)); } return(Expression.Lambda <Func <T, IData> >(TransformerHelper.IsEqualsTypes(Type1, Type2) ? list[0] : Expression.Block(typeof(IData), new ParameterExpression[] { data }, list), value)); }
private Expression <Func <IData, T> > CreateFromMethod() { var idata = Expression.Parameter(typeof(IData)); var data = Expression.Variable(typeof(Data <>).MakeGenericType(Type2)); var value = Expression.Variable(typeof(T)); List <Expression> list = new List <Expression>(); if (TransformerHelper.IsEqualsTypes(Type1, Type2)) { list.Add(Expression.Label(Expression.Label(Type1), Expression.Convert(idata, data.Type).Value())); } else { list.Add(Expression.Assign(data, Expression.Convert(idata, data.Type))); list.Add(TransformerHelper.BuildBody(value, data.Value(), MembersOrder1, MembersOrder2)); list.Add(Expression.Label(Expression.Label(Type1), value)); } return(Expression.Lambda <Func <IData, T> >(TransformerHelper.IsEqualsTypes(Type1, Type2) ? list[0] : Expression.Block(Type1, new ParameterExpression[] { data, value }, list), idata)); }