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); }
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); }