예제 #1
0
        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));
            }
        }
예제 #2
0
        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));
        }