Пример #1
0
        public static Func <T, XElement> GenerateSingleElemenetFunc <TProperty>(XName name, Expression <Func <T, TProperty> > propFunc, XmlMapper <TProperty> mapper) where TProperty : class, new()
        {
            var itemParam      = Expression.Parameter(typeof(T));
            var invoke         = Expression.Invoke(propFunc, itemParam);
            var mapperConstant = Expression.Constant(mapper);
            var nameConstant   = Expression.Constant(name);
            var toXml          = mapper.GetType().GetMethod("ToXml", new[] { typeof(TProperty), typeof(XName) });
            var callToXml      = Expression.Call(mapperConstant, toXml, invoke, nameConstant);

            var func = Expression.Lambda <Func <T, XElement> >(callToXml, itemParam).Compile();

            return(func);
        }
Пример #2
0
        public static Func <T, XElement> GenerateCollectionElementFunc <TProperty>(string name, Expression <Func <T, ICollection <TProperty> > > propFunc, XmlMapper <TProperty> mapper)
            where TProperty : class, new()
        {
            var itemParam      = Expression.Parameter(typeof(T));
            var invoke         = Expression.Invoke(propFunc, itemParam);
            var mapperConstant = Expression.Constant(mapper);

            XName containerElementName;
            XName childElementName;

            GetContainerElementName(name, out containerElementName, out childElementName);

            var containerNameConstant  = Expression.Constant(containerElementName);
            var childNameConstant      = Expression.Constant(childElementName);
            var propertyEnumerableType = typeof(IEnumerable <>).MakeGenericType(typeof(TProperty));
            var toXml = mapper.GetType()
                        .GetMethod("ToXml", new[] { propertyEnumerableType, typeof(XName), typeof(XName) });
            var callToXml = Expression.Call(mapperConstant, toXml, invoke, containerNameConstant,
                                            childNameConstant);

            var func = Expression.Lambda <Func <T, XElement> >(callToXml, itemParam).Compile();

            return(func);
        }