예제 #1
0
        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;
        }
예제 #2
0
 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();
 }
예제 #3
0
 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;
 }
예제 #4
0
        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);
            }
        }
예제 #5
0
 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;
 }
예제 #6
0
 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);
 }
예제 #7
0
        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);
        }