private static Expression CustomResolverFn(Expression source, IMemberModel destinationMember, CompileArgument arg) { var config = arg.Settings; var resolvers = config.Resolvers; if (resolvers == null || resolvers.Count <= 0) return null; Expression getter = null; LambdaExpression lastCondition = null; for (int j = 0; j < resolvers.Count; j++) { var resolver = resolvers[j]; if (destinationMember.Name.Equals(resolver.MemberName)) { Expression invoke = resolver.Invoker.Apply(source); getter = lastCondition != null ? Expression.Condition(lastCondition.Apply(source), getter, invoke) : invoke; lastCondition = resolver.Condition; if (resolver.Condition == null) break; } } if (lastCondition != null) getter = Expression.Condition(lastCondition.Apply(source), getter, Expression.Constant(getter.Type.GetDefault(), getter.Type)); return getter; }
private static Expression PropertyOrFieldFn(Expression source, IMemberModel destinationMember, CompileArgument arg) { var members = source.Type.GetPublicFieldsAndProperties(); var strategy = arg.Settings.NameMatchingStrategy; var destinationMemberName = strategy.DestinationMemberNameConverter(destinationMember.Name); return members.Where(member => strategy.SourceMemberNameConverter(member.Name) == destinationMemberName) .Select(member => member.GetExpression(source)) .FirstOrDefault(); }
private static Expression GetMethodFn(Expression source, IMemberModel destinationMember, CompileArgument arg) { if (arg.MapType == MapType.Projection) return null; var strategy = arg.Settings.NameMatchingStrategy; var destinationMemberName = "Get" + strategy.DestinationMemberNameConverter(destinationMember.Name); var getMethod = source.Type.GetMethods(BindingFlags.Public | BindingFlags.Instance) .FirstOrDefault(m => strategy.SourceMemberNameConverter(m.Name) == destinationMemberName); return getMethod != null ? Expression.Call(source, getMethod) : null; }
private static Expression DictionaryFn(Expression source, IMemberModel destinationMember, CompileArgument arg) { var dictType = source.Type.GetDictionaryType(); if (dictType == null) return null; var strategy = arg.Settings.NameMatchingStrategy; var destinationMemberName = strategy.DestinationMemberNameConverter(destinationMember.Name); var key = Expression.Constant(destinationMemberName); var args = dictType.GetGenericArguments(); if (strategy.SourceMemberNameConverter != NameMatchingStrategy.Identity) { var method = typeof (Extensions).GetMethods().First(m => m.Name == "FlexibleGet").MakeGenericMethod(args[1]); return Expression.Call(method, source.To(dictType), key, Expression.Constant(strategy.SourceMemberNameConverter)); } else { var method = typeof(Extensions).GetMethods().First(m => m.Name == "GetValueOrDefault").MakeGenericMethod(args); return Expression.Call(method, source.To(dictType), key); } }
public static Expression GetDeepFlattening(Expression source, string propertyName, CompileArgument arg) { var strategy = arg.Settings.NameMatchingStrategy; var properties = source.Type.GetPublicFieldsAndProperties(); foreach (var property in properties) { var sourceMemberName = strategy.SourceMemberNameConverter(property.Name); var propertyType = property.Type; if (propertyType.GetTypeInfo().IsClass && propertyType != _stringType && propertyName.StartsWith(sourceMemberName)) { var exp = property.GetExpression(source); var ifTrue = GetDeepFlattening(exp, propertyName.Substring(sourceMemberName.Length).TrimStart('_'), arg); if (ifTrue == null) return null; if (arg.MapType == MapType.Projection) return ifTrue; return Expression.Condition( Expression.Equal(exp, Expression.Constant(null, exp.Type)), Expression.Constant(ifTrue.Type.GetDefault(), ifTrue.Type), ifTrue); } else if (string.Equals(propertyName, sourceMemberName)) { return property.GetExpression(source); } } return null; }
private static Expression FlattenMemberFn(Expression source, IMemberModel destinationMember, CompileArgument arg) { var strategy = arg.Settings.NameMatchingStrategy; var destinationMemberName = strategy.DestinationMemberNameConverter(destinationMember.Name); return ReflectionUtils.GetDeepFlattening(source, destinationMemberName, arg); }
public static Expression GetDeepFlattening(Expression source, string propertyName, CompileArgument arg) { var strategy = arg.Settings.NameMatchingStrategy; var properties = source.Type.GetFieldsAndProperties(); foreach (var property in properties) { var sourceMemberName = strategy.SourceMemberNameConverter(property.Name); var propertyType = property.Type; if (propertyType.GetTypeInfo().IsClass&& propertyType != _stringType && propertyName.StartsWith(sourceMemberName)) { var exp = property.GetExpression(source); var ifTrue = GetDeepFlattening(exp, propertyName.Substring(sourceMemberName.Length).TrimStart('_'), arg); if (ifTrue == null) { continue; } if (arg.MapType == MapType.Projection) { return(ifTrue); } return(Expression.Condition( Expression.Equal(exp, Expression.Constant(null, exp.Type)), Expression.Constant(ifTrue.Type.GetDefault(), ifTrue.Type), ifTrue)); } else if (string.Equals(propertyName, sourceMemberName)) { return(property.GetExpression(source)); } } return(null); }