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