Exemple #1
0
        public static bool AutoMapEnumerable <T>(this MemberInfo member, FallbackStrategy emptyValueStrategy, out EnumerableExcelPropertyMap <T> map)
        {
            Type     rawType     = member.MemberType();
            TypeInfo rawTypeInfo = rawType.GetTypeInfo();

            if (!member.AutoMap(emptyValueStrategy, out SingleExcelPropertyMap <T> elementMapping))
            {
                map = null;
                return(false);
            }

            if (rawType.IsArray)
            {
                map = new ArrayPropertyMap <T>(member, elementMapping);
                return(true);
            }
            else if (rawTypeInfo.IsInterface)
            {
                if (rawTypeInfo.IsAssignableFrom(typeof(List <T>).GetTypeInfo()))
                {
                    map = new InterfaceAssignableFromListPropertyMap <T>(member, elementMapping);
                    return(true);
                }
            }
            else if (rawType.ImplementsInterface(typeof(ICollection <T>)))
            {
                map = new ConcreteICollectionPropertyMap <T>(rawType, member, elementMapping);
                return(true);
            }

            map = null;
            return(false);
        }
Exemple #2
0
        private static bool InferMapping <T>(this MemberInfo member, FallbackStrategy emptyValueStrategy, out ExcelPropertyMap mapping)
        {
            if (member.AutoMap(emptyValueStrategy, out SingleExcelPropertyMap <T> singleMapping))
            {
                mapping = singleMapping;
                return(true);
            }

            if (member.MemberType().GetElementTypeOrEnumerableType(out Type elementType))
            {
                MethodInfo method = AutoMapEnumerableMethod.MakeGenericMethod(elementType);

                var  parameters = new object[] { member, emptyValueStrategy, null };
                bool result     = (bool)method.Invoke(null, parameters);
                if (result)
                {
                    mapping = (ExcelPropertyMap)parameters[2];
                    return(true);
                }
            }

            if (member.AutoMapObject(emptyValueStrategy, out ObjectExcelPropertyMap <T> objectMapping))
            {
                mapping = objectMapping;
                return(true);
            }

            mapping = null;
            return(false);
        }
Exemple #3
0
        /// <summary>
        /// Creates a map for a property or field given a MemberExpression reading the property or field.
        /// This is used for mapping primitives such as string, int etc.
        /// </summary>
        /// <typeparam name="TProperty">The type of the property or field to map.</typeparam>
        /// <param name="expression">A MemberExpression reading the property or field.</param>
        /// <returns>The map for the given property or field.</returns>
        public SingleExcelPropertyMap <TProperty> Map <TProperty>(Expression <Func <T, TProperty> > expression)
        {
            MemberExpression memberExpression = GetMemberExpression(expression);
            MemberInfo       member           = memberExpression.Member;

            bool canMap = member.AutoMap(EmptyValueStrategy, out SingleExcelPropertyMap <TProperty> mapping);

            if (!canMap)
            {
                throw new ExcelMappingException($"Don't know how to map type {typeof(TProperty)}.");
            }

            AddMapping(mapping, expression);
            return(mapping);
        }