private Func <T1, TVal[]> CreateExpression(IEnumerable <string> fields) { var t1param = EE.Param <T1>("obj"); var elist = fields.Select(f => t1param.Dot(f)).Cast <Expression>(); if (typeof(TVal) == typeof(object)) { elist = elist.Select(e => EE.Box(e)); } var resultArr = Expression.NewArrayInit(typeof(TVal), elist); var l = Expression.Lambda <Func <T1, TVal[]> >(resultArr, t1param); return(l.Compile()); }
private Func <T1, T2, DifferReturnValueType[]> CreateExpression(IEnumerable <string> fields) { var t1param = EE.Param <T1>("left"); var t2param = EE.Param <T2>("right"); var NULL = EE.Val <DifferReturnValueType>(null); var TupleCreate = EE.Method(() => Tuple.Create <string, object>("", null)); var cmplist2 = fields.Select(f => Expression.Condition(t1param.Dot(f).IsEq(t2param.Dot(f)), NULL, Expression.Call(TupleCreate, EE.Val(f), EE.Box(t2param.Dot(f))))); var resultArr = Expression.NewArrayInit(typeof(DifferReturnValueType), cmplist2); var l = Expression.Lambda <Func <T1, T2, DifferReturnValueType[]> >(resultArr, t1param, t2param); return(l.Compile()); }