private static void BuildProperty(ModelPropertyInfo mp1, PropertyConvertContext context, object foo) { if (!mp1.IsReadOnly) { MemberBindingState state = (MemberBindingState)foo; Expression member = state.Parameter; foreach (var mp0 in context.SourcePropertyChain) { member = Expression.MakeMemberAccess(member, mp0.PropertyInfo); } state.Bindings.Add(Expression.Bind(mp1.PropertyInfo, member)); } }
public static IQueryable <TTarget> Build <TSource, TTarget>(IQueryable <TSource> source, ModelConvertOptions options) { if (options == null) { options = ModelConvert.Target <TTarget>().Source <TSource>().Options.IgnoreReadOnly(); } options.IgnoreReadOnly(); MemberBindingState state = new MemberBindingState(Expression.Parameter(typeof(TSource), "obj")); ModelConvert.WalkConvertiblProperties(null, ModelInfo.GetModelInfo(typeof(TTarget)), null, ModelInfo.GetModelInfo(typeof(TSource)), options, BuildProperty, state); var body = Expression.MemberInit(Expression.New(typeof(TTarget)), state.Bindings); var lambda = Expression.Lambda <Func <TSource, TTarget> >(body, state.Parameter); return(source.Select(lambda)); }